MongoDB稀疏索引和数组:索引的文件太多

时间:2013-08-27 16:29:35

标签: mongodb indexing sparse-matrix compound-index

我对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});

发布统计数据给我一个“奇怪”的结果:索引大约是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”})。提示(“meta.old_slugs_1”)// 1个文件

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题:您可以使用复合索引搜索其索引的键的前缀。例如,如果您仅搜索aab,则会使用您的第一个索引。因此,sparse只会无法索引a为空的文档。

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