0

我对 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 个文档

4

1 回答 1

0

对于您的第一个问题:您可以使用复合索引来搜索它索引的键的前缀。例如,如果您仅搜索anda或同时搜索aand ,则将使用您的第一个索引b。因此,sparse只会无法索引a为空的文档。

对于您的第二个问题,我没有答案,但您应该尝试更新 MongoDB 并再次尝试 - 它的移动速度非常快,并且稀疏索引在过去几个月中变得更好。

于 2013-12-09T18:50:06.637 回答