2013-05-13 74 views
4

有一个样品http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/#indexes-covered-queriesmongodb的索引覆盖查询

任何索引的字段都是在子文档字段。要在子文档中为 索引,请使用点符号。例如,考虑一个集合 用户提供下列形式的文档:{_id:1,用户:{登录: “测试”}}收集有以下指标:

{用户:1}

{ “user.login”:1}

【用户:1}索引覆盖以下查询:

db.users.find({用户:{登录: “测试器”}},{用户:1,_id:0})

但是,{“u ser.login“:1}索引不包括以下内容 查询:

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

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

我想知道为什么{“user.login”:1}索引不包括查询的根本原因。

谢谢

+1

正如上面所解释的:“*如果任何索引字段是子文档中的字段,索引不能覆盖查询*”... – assylias 2013-05-13 12:55:45

+0

您能否显示您的解释计划? – 2013-05-13 12:57:11

+0

我不知道根本原因,我必须诚实,但我相信对象评估工作和点符号不是因为查询运算符可以用点符号执行 – Sammaye 2013-05-13 13:02:17

回答

4

的“根本原因”是,这个功能目前尚未实现。具体来说,该功能是SERVER-2104,一旦实现,你将得到你需要的结果(所以去投票并看它)。同时,要利用覆盖索引查询,您需要避免在索引中使用子文档。

4

“我想知道为什么{”user.login“:1}索引不包含查询的根源。”

对不起,延迟回复。这里是我的解释: 所有查询默认返回“_id”字段,除非您在投影中省略它们。 即使您没有在{“user.login”:1}中提到“_id”,它也会返回“_id”,这就是索引未被覆盖的原因。

+0

经过测试,它是正确的。你可以通过声明'{field:0}'(省略)或'{field:1 }'(include) – 2015-02-24 21:27:59

+0

@ user2434012你能解释一下你的意思吗?即使你在{“user.login”:1}中没有提到“_id”,“在你的评论中? – user641887 2016-06-29 16:47:20