欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB高级部分

程序员文章站 2023-03-08 11:13:03
1.关联关系嵌入式关系建模引用式关系2.数据库引用DBRefs(自动参考)手动参考3.覆盖查询(是一个查询,本质上就是直接从索引中取出数据,不会对文档进行扫描)1)查询中的所有字段都是索引的一部分2)查询中返回的所有字段都在同一索引中覆盖索引的示例:1)创建复合索引db.users.ensureIndex({gender:1,user_name:1})2)覆盖索引示例db.users.find({gender:"M"},{user_name:1,_i....
1.关联关系
	嵌入式关系建模
	引用式关系
2.数据库引用
	DBRefs(自动参考)
	手动参考
	
3.覆盖查询(是一个查询,本质上就是直接从索引中取出数据,不会对文档进行扫描)
	1)查询中的所有字段都是索引的一部分
	2)查询中返回的所有字段都在同一索引中
	
	覆盖索引的示例:
	1)创建复合索引
	db.users.ensureIndex({gender:1,user_name:1})
	2)覆盖索引示例
	db.users.find({gender:"M"},{user_name:1,_id:0})
	
	如果_id不排除,那么此次查询将不能被创建的复合索引覆盖,也就是说此次查询,走的是文档
	
	无法覆盖索引的情况:
	1)任何索引的字段是一个数组
	2)任何索引的字段是一个子文档

4. 分析查询
	1)使用$explain操作符:提供有关查询的信息,查询中使用的索引和其他统计信息,在分析索引优化的情况下非常有用
	db.user.find({gender:"M"},{user_name:1,_id:0}).explain()
	2)使用$hint操作符:强制查询优化器使用指定的索引来运行查询。当测试不同索引的查询的性能的时候,就显得特别有用了。
	db.user.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

5. 原子操作(MongoDB不支持多文档原子事务,但是它可以为单个文档提供了原子操作。
	1)维持原子性的推荐方法是将所有相关信息保存在一起,并使用嵌入式文档在一个文档中一起更新。这将确保单个文档的所有更新都是原子的。(findAndModify的使用)
	
6.高级索引
	1)索引数组字段
	在数组上创建一个索引依次为每个字段创建单独的索引条目。
	创建索引:db.user.ensureIndex({"tags":1})
	验证是否使用正确的索引:db.user.find({tags:"cricket"}).explain()
	2)索引子文档字段(在子文档的所有字段上创建一个索引)
	创建索引:db.user.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})
	查询表达式必须遵循的索引的顺序:db.user.find({"address.city":"Haikou","address.province":"Hainan"})

7.索引限制
	1)索引额外开销
		每个索引占用一些空间,并导致每次插入、更新和删除的开销。因此,如果很少使用集合进行读取操作(大部分是插入或更新操作),则建议不要使用索引。
	2)RAM、内存的使用
		由于索引存储在RAM中,因此应确保索引的总大小不超过RAM限制。 如果总大小超过了系统内存的大小,MongoDB将开始删除一些索引,从而导致性能下降。
	3)查询限制
		索引不能在使用的查询中使用
			正则表达式或否定运算符,如$nin,$not等
			算术运算符,如$mod等
			$where子句
	4)索引键限制
		从MongoDB2.6版本开始,如果现有索引字段的值超过索引键限制,MongoDB将不会创建索引。
	5)插入超过索引键限制的文档
		如果本文档的索引字段值超过索引键限制,MongoDB将不会将任何文档插入索引集合。mongorestore和mongoimport工具也是如此。
	6)索引的最大范围
		集合不能超过64个索引
		索引名的长度不能超过125个字符
		复合索引最多可以编号31个字段
		
8.ObjectId
	ObjectId 是具有以下结构的12字节BSON类型
		前4个字节表示从unix纪元开始的秒数
		接下来的3个字节是机器标识符
		接下来的2个字节由进程ID组成
		最后3个字节是随机计数器值

	MongoDB使用ObjectIds作为每个文档的_id字段的默认值,这是在创建任何文档时生成的。ObjectId的复杂组合使得所有_id字段都是唯一的。
	
	创建文档的时间戳(因为ObjectId默认存储4字节的时间戳,大多情况下,不再需要额外存储文档的创建时间,可以使用getTimestamp获取文档的创建时间)
	
	将ObjectId转换为String(某些特殊的情况下,可能需要使用字符串格式的ObjectId,如果要转换ObjectId为字符串,newObjectId.str)
	
9.MapReduce(将大量数据合并为有用的聚合结果)
	语法:
	db.collection.mapReduce(
		function() {emit(key,value);},  //map function
		function(key,values) {return reduceFunction}, {   //reduce function
			out: collection,
			query: document,
			sort: document,
			limit: number
		}
	)


10.文本搜索
	从MongoDB2.4开始,MongoDB开始支持文本索引来搜索字符串内容,

参考:https://www.yiibai.com/mongodb/mongodb_regular_expression.html

本文地址:https://blog.csdn.net/qq_32252917/article/details/107312870