MongoDB索引覆盖查询

4

这里有一个示例http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/#indexes-covered-queries

任何被索引的字段都是子文档中的字段。要索引子文档中的字段,请使用点表示法。例如,考虑具有以下形式文档的用户集合:{_id: 1, user: {login: "tester"}}。该集合具有以下索引:

{user: 1}

{"user.login": 1}

{user: 1}索引涵盖以下查询:

db.users.find({user: {login: "tester"}}, {user: 1, _id: 0})

然而{"user.login": 1}索引不涵盖以下查询:

db.users.find({"user.login": "tester"}, {"user.login": 1, _id: 0})

但是,此查询确实使用{"user.login": 1}索引来查找匹配的文档。

我希望了解为什么 { "user.login": 1 } 索引不能覆盖查询的根本原因。
谢谢。

1
正如上面所解释的:“如果索引字段是子文档中的字段,则索引无法覆盖查询...” - assylias
你能展示一下你的执行计划吗? - Srivatsa N
我必须诚实地说,我不知道根本原因,但我相信对象评估有效而点符号无效是因为可以针对点符号执行的查询运算符。 - Sammaye
2个回答

4
“根本原因”是这个功能目前还没有实现。具体来说,此功能为SERVER-2104,一旦它被实现,你将获得所需的结果(因此请投票支持并关注它)。与此同时,为了利用覆盖索引查询,您需要避免在索引中使用子文档。

4

我想知道为什么 { "user.login": 1 } 索引没有覆盖查询的根本原因。

很抱歉回复晚了。这是我的解释: 默认情况下,所有查询都会返回 "_id" 字段,除非你在投影中省略它们。 即使你在 { "user.login": 1 } 中没有提到 "_id",它也会返回 "_id",这就是索引没有覆盖的原因。


已测试并且正确。您可以通过声明 { field : 0 }(省略)或 { field : 1 }(包含)来投影字段。 - Howard Lee
@user2434012,您能否解释一下您在评论中所说的“即使您没有在{“user.login”:1}中提到“_id”,是什么意思?”? - user641887

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接