稀疏索引和部分索引

稀疏索引:

这些对于可选但也应该是唯一的字段特别有用。

{ "_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 选项和稀疏的选项不能同时被指定。