稀疏索引仅包含具有索引字段的文档条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的所有文档。索引是“稀疏的”,因为它不包括集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
重要
要创建sparse索引,请使用选项设置为的
db.collection.createIndex()方法。例如,外壳程序中的以下操作在
集合的字段上创建稀疏索引:sparsetruemongoxmpp_idaddresses
索引不索引不包含该xmpp_id
字段的文档。
注意
不要将MongoDB中的稀疏索引与 其他数据库中的块级索引混淆。可以将它们视为具有特定过滤器的密集索引。
sparse指数和不完整的结果¶如果稀疏索引会导致查询和排序操作的结果集不完整,除非hint()明确指定索引,否则MongoDB将不会使用
该索引。
例如,查询将不会在字段上使用稀疏索引,除非明确提示。有关详细说明行为的示例,请参见
集合上的稀疏索引无法返回完整结果。{ x: { $exists: false } }x
在版本3.4中更改。
如果在执行集合中的所有文档时
都包含一个hint()指定
稀疏索引的count() a(即查询谓词为空),则即使稀疏索引导致计数错误,也会使用稀疏索引。
为了获得正确的计数,对集合中的所有文档进行计数时,请不要hint()使用
稀疏索引。
sparse默认为索引¶2dsphere(版本2), 2d,
geoHaystack和文本索引始终为sparse。
考虑一个scores包含以下文档的集合:
该集合的字段索引稀疏score:
然后,对scores集合的以下查询使用稀疏索引返回score字段小于($lt)的文档90:
由于userid的文档"newbie"不包含该
score字段,因此不满足查询条件,因此查询可以使用稀疏索引返回结果:
考虑一个scores包含以下文档的集合:
该集合的字段索引稀疏score:
因为userid的文档"newbie"不包含该
score字段,所以稀疏索引不包含该文档的条目。
考虑以下查询以返回
集合中的所有文档scores(按score字段排序):
即使排序是通过索引字段进行的,MongoDB也不会 选择稀疏索引来满足查询以返回完整结果:
要使用稀疏索引,请使用显式指定索引
hint():
使用索引将导致仅返回具有以下score字段的那些文档: