我有一個問題,爲我的mongo查詢生成適當的索引,這將避免SORT階段。我甚至不確定在我的情況下是否可能。因此,這裏是我的查詢與執行統計:這就是爲什麼「M」不包含在任何索引
db.getCollection('test').find(
{
"$or" : [
{
"a" : { "$elemMatch" : { "_id" : { "$in" : [4577] } } },
"b" : { "$in" : [290] },
"c" : { "$in" : [35, 49, 57, 101, 161, 440] },
"d" : { "$lte" : 399 }
},
{
"e" : { "$elemMatch" : { "numbers" : { "$in" : ["1K0407151AC", "0K20N51150A"] } } },
"d" : { "$lte" : 399 }
}]
})
.sort({ "X" : 1, "d" : 1, "Y" : 1, "Z" : 1 }).explain("executionStats")
字段「M」,「a」和「E」是數組,。
如果您檢查execution stats屏幕截圖,您會看到內存使用情況非常接近最大值,不幸的是,由於32MB的限制,我查詢的查詢未能執行。
指數爲$或查詢的第一部分: { 「a._id」:1, 「X」:1, 「d」:1, 「Y」:1, 「Z 「:1, 」b「:1, 」C「:1 }
指數爲$或查詢的第二部分: { 」e.numbers「:1, 」X「: 1, 「d」:1, 「Y」:1, 「Z」:1 }
索引由查詢使用,但不用於排序。而不是SORT階段,我希望看到SORT_MERGE階段,但現在沒有成功。如果我在$或者單獨運行部分查詢,他們可以使用索引來避免在內存中排序。作爲一種解決方法,它是可以的,但我需要合併並通過應用程序對結果進行求值。
MongoDB版本是3.4.2。我檢查了that和that的問題。我的查詢是結果。可能我錯過了什麼?
編輯:蒙戈文件看起來像:
{
"_id" : "290_440_K760A03",
"Z" : "K760A03",
"c" : 440,
"Y" : "NPS",
"b" : 290,
"X" : "Schlussleuchte",
"e" : [
{
"..." : 184,
"numbers" : [
"0K20N51150A"
]
}
],
"a" : [
{
"_id" : 4577,
"..." : [
{
"..." : [
{
"..." : "R",
}
]
}
]
},
{
"_id" : 4578
}
],
"d" : 101,
"m" : [
"AT",
"BR",
"CH"
],
"moreFields":"..."
}
編輯2:刪除申請「M」從查詢到減少的人,誰願意幫助的複雜性和attached測試收集轉儲: )
根據您鏈接到的第一個問題的答案,兩個指數都需要在' 「X」 來_END_:1, 「d」:1, 「Y」:1, 「Z」:1'一個SORT_MERGE ,不只是包含這些領域。 – JohnnyHK
@JohnnyHK,將第一個索引改爲「{」a._id「:1,」X「:1,」d「:1,」Y「:1,」Z「:1}但沒有成功。排序仍然在內存中,查詢變得更慢。 – stoos
可以請您添加一個或兩個數據的實例 –