稀疏索引仅包含具有索引字段的文档条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的所有文档。索引是“稀疏的”,因为它不包括集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
重要
要创建sparse
索引,请使用选项设置为的
db.collection.createIndex()
方法。例如,外壳程序中的以下操作在
集合的字段上创建稀疏索引:sparse
true
mongo
xmpp_id
addresses
索引不索引不包含该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
字段的那些文档: