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