- MongoDB官方文档中文版
- MongoDB中文手册说明
- MongoDB简介
- 安装 MongoDB
- The mongo Shell
- MongoDB CRUD 操作
- 聚合
- 数据模型
- 事务
- 索引
- 安全
- 安全检查列表
- 启用访问控制
- 身份验证
- 基于角色的访问控制
- TLS / SSL(传输加密)
- 静态加密
- 客户端字段级加密
- 审计
- 网络和配置强化
- 实现字段级别修订
- 安全参考
- 附录
- 变更流
- 复制
- 分片
- 分片键
- 哈希分片
- 范围分片
- 区
- 管理分片区
- 按位置细分数据
- 用于更改SLA或SLO的分层硬件
- 按应用或客户细分数据
- 仅插入工作负载的分布式本地写入
- 管理分片区
- 使用块进行数据分区
- 在分片集群中拆分数据块
- 管理
- 存储
- 存储引擎
- 日志记录
- 管理日志记录
- GridFS
- FAQ:MongoDB 存储
- 存储引擎
- 参考
- 运算符
- 查询与映射运算符
- 更新运算符
- 聚合管道阶段
- 聚合管道操作符
- $abs (aggregation)
- $acos (aggregation)
- $acosh (aggregation)
- $add (aggregation)
- $addToSet (aggregation)
- $allElementsTrue (aggregation)
- $and (aggregation)
- $anyElementTrue (aggregation)
- $arrayElemAt (aggregation)
- $arrayToObject (aggregation)
- $asin (aggregation)
- $asinh (aggregation)
- $atan (aggregation)
- $atan2 (aggregation)
- $atanh (aggregation)
- $avg (aggregation)
- $ceil (aggregation)
- $cmp (aggregation)
- $concat (aggregation)
- $concatArrays (aggregation)
- $cond (aggregation)
- $convert (aggregation)
- $cos (aggregation)
- $dateFromParts (aggregation)
- $dateToParts (aggregation)
- $dateFromString (aggregation)
- $literal (aggregation)
- 查询修饰符
- 数据库命令
- 聚合命令
- 地理空间命令
- 查询和写操作命令
- 查询计划缓存命令
- 认证命令
- 用户管理命令
- 角色管理命令
- 复制命令
- 分片命令
- 会话命令
- 管理命令
- 诊断命令
- 免费监控命令
- 系统事件审计命令
- mongo Shell 方法
- 集合方法
- db.collection.aggregate()
- db.collection.bulkWrite()
- db.collection.copyTo()
- db.collection.count()
- db.collection.countDocuments()
- db.collection.estimatedDocumentCount()
- db.collection.createIndex()
- db.collection.createIndexes()
- db.collection.dataSize()
- db.collection.deleteOne()
- db.collection.deleteMany()
- db.collection.distinct()
- db.collection.drop()
- db.collection.dropIndex()
- db.collection.dropIndexes()
- db.collection.ensureIndex()
- db.collection.explain()
- db.collection.find()
- db.collection.findAndModify()
- db.collection.findOne()
- db.collection.findOneAndDelete()
- db.collection.findOneAndReplace()
- db.collection.findOneAndUpdate()
- db.collection.getIndexes()
- db.collection.getShardDistribution()
- db.collection.getShardVersion()
- db.collection.insert()
- db.collection.insertOne()
- db.collection.insertMany()
- db.collection.isCapped()
- db.collection.latencyStats()
- db.collection.mapReduce()
- db.collection.reIndex()
- db.collection.remove()
- db.collection.renameCollection()
- db.collection.replaceOne()
- db.collection.save()
- db.collection.stats()
- db.collection.storageSize()
- db.collection.totalIndexSize()
- db.collection.totalSize()
- db.collection.update()
- db.collection.updateOne()
- db.collection.updateMany()
- db.collection.watch()
- db.collection.validate()
- 词汇表
- 默认的MongoDB端口
- 默认的MongoDB读/写关注
- 服务器会话
- MongoDB驱动
- FAQ
- 联系我们
- 更多资料
- [快学Mongo]
- [Mongo问题讨论区]
- [Mongo 驱动使用手册]
- 本书使用 GitBook 发布
Sparse 索引
Sparse索引
在本页面
Sparse索引只包含有索引字段的文档的条目,即使索引字段包含空值。索引会跳过任何缺少索引字段的文档。索引是“稀疏的”,因为它不包括一个集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
重要的
从MongoDB 3.2开始,MongoDB提供了创建部分索引的选项。部分索引提供了sparse索引功能的超集。如果你正在使用MongoDB 3.2或更高版本,部分索引应该比稀疏索引更受欢迎。
创建sparse索引
要创建一个“sparse”索引,使用db.collection.createIndex()方法,并将“sparse”选项设置为“true”。例如,下面的操作在mongo shell中创建了一个稀疏的索引在xmpp_id字段的地址集合:
db.addresses.createIndex( { "xmpp_id": 1 }, { sparse: true } )
索引不会索引不包含“xmpp_id”字段的文档。
注意
不要将MongoDB中的sparse索引与其他数据库中的块级索引混淆。可以将它们看作具有特定过滤器的密集索引。
行为
“Sparse”索引和不完整结果
如果sparse索引会导致查询和排序操作的结果集不完整,MongoDB将不会使用该索引,除非hint()明确指定该索引。
例如,查询{x: {$exists: false}}
不会在x字段上使用sparse索引,除非有明确提示。参见集合上的稀疏索引不能返回完整的结果了解详细的行为示例。
Changed in version 3.4.
如果在执行集合中所有文档的count()(i.e.带有空查询谓词)时包含 sparse索引count()
,则即使sparse索引导致计数不正确,也会使用sparse索引。
db.collection.insert({ _id: 1, y: 1 } );
db.collection.createIndex( { x: 1 }, { sparse: true } );
db.collection.find().hint( { x: 1 } ).count();
要获得正确的计数,在对集合中的所有文档执行计数时,不要使用sparse索引的“hint()”。
db.collection.find().count();
db.collection.createIndex({ y: 1 });
db.collection.find().hint({ y: 1 }).count();
默认情况下是“sparse”的索引
2dsphere(版本2), 2d, geoHaystack和文本索引始终为sparse
。
Sparse复合索引
Sparse复合索引只包含升序/降序索引键将索引一个文档,只要该文档包含至少一个键。
包含一个地理空间的稀疏的复合索引键(即2 dsphere, 2d,或geoHaystack索引键)连同升序/降序索引键,只有地理空间的存在领域(s)文档中确定索引文档的引用。
对于包含text索引键和升序/降序索引键的sparse复合索引,只有“text”索引字段的存在决定该索引是否引用一个文档。
“Sparse”和“unique”属性
一个“sparse”和unique索引可以防止集合的文档具有一个字段的重复值,但允许多个文档忽略该键。
例子
在集合上创建sparse索引
考虑一个包含以下文档的集合“scores”:
{ "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie" }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
{ "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
集合在“score”字段上有一个sparse索引:
db.scores.createIndex( { score: 1 } , { sparse: true } )
然后,下面对scores集合的查询使用sparse索引返回score字段小于(' $lt ')的文档90:
db.scores.find( { score: { $lt: 90 } } )
由于userid的文档"newbie"
不包含该 score
字段,因此不满足查询条件,因此查询可以使用sparse索引返回结果:
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
集合上的sparse索引不能返回完整的结果
考虑一个包含以下文档的集合“scores”:
{ "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie" }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
{ "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
集合在“score”字段上有一个sparse索引:
db.scores.createIndex( { score: 1 } , { sparse: true } )
因为userid的文档 "newbie"
不包含score
字段,所以sparse索引不包含该文档的条目。
考虑以下查询返回scores
集合中的所有文档,按score
字段排序:
db.scores.find().sort( { score: -1 } )
即使是按索引字段排序,MongoDB也不会选择sparse索引来完成查询,以返回完整的结果:
{ "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
{ "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie" }
要使用sparse索引,显式地用hint()
指定索引:
db.scores.find().sort( { score: -1 } ).hint( { score: 1 } )
使用索引只返回那些带有score
字段的文档:
{ "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
也可以看看:
explain()
和 Analyze Query Performance
具有唯一约束的sparse索引
考虑一个包含以下文档的集合scores:
{ "_id" : ObjectId("523b6e32fb408eea0eec2647"), "userid" : "newbie" }
{ "_id" : ObjectId("523b6e61fb408eea0eec2648"), "userid" : "abby", "score" : 82 }
{ "_id" : ObjectId("523b6e6ffb408eea0eec2649"), "userid" : "nina", "score" : 90 }
您可以使用以下操作在score字段上创建一个unique constraint和sparse过滤器:
db.scores.createIndex( { score: 1 } , { sparse: true, unique: true } )
该索引将允许插入具有该score
字段唯一值或不包含该score
字段的文档。这样,鉴于scores
集合中现有的文档,索引允许进行以下插入操作:
db.scores.insert( { "userid": "AAAAAAA", "score": 43 } )
db.scores.insert( { "userid": "BBBBBBB", "score": 34 } )
db.scores.insert( { "userid": "CCCCCCC" } )
db.scores.insert( { "userid": "DDDDDDD" } )
但是,索引不允许添加以下文件,因为文件已经存在,其score值为82和90:
db.scores.insert( { "userid": "AAAAAAA", "score": 82 } )
db.scores.insert( { "userid": "BBBBBBB", "score": 90 } )
Copyright © 上海锦木信息技术有限公司 all right reserved,由 MongoDB汉化小组 提供技术支持文件修订时间: 2020-10-11 20:53:05