2013-05-13 72 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