稀疏索引和部分索引
稀疏索引:
这些对于可选但也应该是唯一的字段特别有用。
{ "_id" : "john@example.com", "nickname" : "Johnnie" }
{ "_id" : "jane@example.com" }
{ "_id" : "julia@example.com", "nickname" : "Jules"}
{ "_id" : "jack@example.com" }
由于两个条目没有指定 nickname
,并且索引将未指定的字段视为 null,因此索引创建将失败并且 2 个文档具有 null
,因此:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
会让你仍然拥有’null’昵称。
稀疏索引更紧凑,因为它们跳过/忽略未指定该字段的文档。因此,如果你的集合中只有不到 10%的文档指定了此字段,则可以创建更小的索引 - 如果要执行以下查询,可以更好地利用有限的内存:
db.scores.find({'nickname': 'Johnnie'})
部分索引:
部分索引表示稀疏索引提供的功能的超集,应该优先于稀疏索引。 ( 3.2 版中新增功能 )
部分索引根据指定的筛选器确定索引条目。
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
如果 rating
大于 5,那么 cuisine
将被索引。是的,我们也可以根据其他属性的值指定要索引的属性。
稀疏和部分索引之间的差异:
稀疏索引仅根据索引字段的存在选择要索引的文档,或者对于复合索引,选择索引字段的存在。
部分索引根据指定的筛选器确定索引条目。过滤器可以包括索引键以外的字段,并且可以指定除存在性检查之外的条件。
仍然,部分索引可以实现与稀疏索引相同的行为
例如:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
注意: 无论是 partialFilterExpression 选项和稀疏的选项不能同时被指定。