2017-04-26 30 views
1

在我的收藏,我已經說了以下結構嵌套文件MongoDB的索引不被使用

{ 
    _id: ObjectId("ssxxdfasfsadf"), 
    a: { 
    b: "somevalue" 
    } 
} 

我創建了a.b索引,如果我使用查找查詢作爲db.collection.find({"a.b": "someothervalue"})工作正常。

如果我將查詢更改爲db.collection.find({a: {b: "somevalue"}}),它將執行完整的集合掃描。 (來源 - find().explain()

當然,我可以修改我的應用程序做查詢作爲"a.b",但我想避免這種情況,因爲我已經在a一些其他領域,在其上的未來我可能需要查詢。

反正有{a: {b: "somevalue"}}可以調整索引嗎?

另外,使用其中一個還是其他的優點/缺點?

+3

如果您計劃將文檔作爲一個整體進行匹配,則可以在整個嵌入式文檔上創建索引。嵌入式字段索引與嵌入式文檔索引不同。更多https://docs.mongodb.com/manual/core/index-single/#create-an-index-on-embedded-document。根據您的使用情況,您可以隨時在嵌入式文檔字段中創建索引/複合索引。 – Veeram

回答

0

我會用第一種方法。快速閱讀MongoDB的文檔,指出以下內容:

MongoDB使用點符號來訪問數組的元素並訪問嵌入文檔的字段。

參見MongoDB Dot NotationQuery on Embedded/Nested Documents


關於調整的指數,你可以index the embedded document as a whole

db.myColl.createIndex({ "a": 1 }); 

但我沒有看到這樣做的原因,如果你只需要索引的特定屬性。我會對Index Size敏感,特別是如果財產將持有大量數據。