我对 MongoDB 稀疏索引有疑问。我有一个包含很少文档(最大 6K)的集合(帖子),可以通过这种方式嵌入子文档:
{
"a": "a-val",
"b": "b-val",
"meta": {
"urls": [ "url1", "url2" ... ],
"field1": "value1",
...
}
}
字段“a”和“b”始终存在,但“meta.urls”可能不存在!
现在,我只插入了一个带有“meta.urls”值的文档,然后我做了
db.post.ensureIndex({"a": 1, "b": 1, "meta.urls": 1}, {sparse: true});
post stats 给了我一个“奇怪”的结果:索引大约是 97MB!这怎么可能?只有一个插入了“meta.urls”的文档,索引大小为 97MB ?
因此,我尝试以这种方式仅创建“meta.urls”索引:
db.post.ensureIndex({"meta.urls": 1}, {sparse: true});
我现在只有 1 个文档的“meta.urls_1”索引。但是如果我解释一个像这样的简单查询
db.post.find({"meta.urls": {$exists: true}}).hint("meta.urls_1").explain({verbose: true});
我有另一个“奇怪”的结果:
"n" : 1,
"nscannedObjects" : 5,
"nscanned" : 5,
为什么 Mongo 会扫描 5 个文档,而不仅仅是索引中的那个?
如果我在“meta.urls”上查询精确匹配,则单个稀疏索引将正常工作。
示例: db.post.find({"meta.urls": "url1"}).hint("meta.old_slugs_1") // 1 个文档