我有一個有數百萬行的mongoDB集合,我試圖優化我的查詢。我目前正在使用聚合框架來檢索數據並按照我的意願對它們進行分組。我典型的聚合查詢是這樣的:$match > $group > $ group > $project
但是,我注意到最後的部分只需要幾毫秒,開始是最慢的。
我試着只用$ match過濾器執行查詢,然後用collection.find執行相同的查詢。聚合查詢需要大約80ms,而find查詢需要0或1ms。
我在幾乎每個領域的索引,所以我想這不是問題。有什麼想法可能會出錯?或者這只是聚合框架的一個「正常」缺陷?
我可以用找到的查詢,而不是聚集查詢,但是我會請求後,進行大量的處理,這個過程能夠儘快與$group
等來這樣做,我寧願保持聚合框架。
感謝,
編輯:
這裏是我的準則:
{
"action" : "click",
"timestamp" : {
"$gt" : ISODate("2015-01-01T00:00:00Z"),
"$lt" : ISODate("2015-02-011T00:00:00Z")
},
"itemId" : "5"
}
你可以發佈你的'$匹配'並找到?在大多數用法中,'$ match'和find應該是等價的,但我想確切地看到您正在比較哪些語句以便做出準確的答案。此外,你是否先運行聚合,然後查找?如果你反覆重複兩遍並比較時間,會發生什麼?差異可能是將結果從磁盤移動到內存中的成本。 – wdberkeley 2015-02-06 16:07:34
我在第一篇文章中添加了標準,但是即使沒有時間戳標準,我也看到了很大的差距。但是現在我想知道它是否與find()返回一個遊標並僅顯示第一個結果有關。 – Owumaro 2015-02-06 16:13:41
好吧,我有很多無用的索引,所以我清理了一切,並創建了一個複合索引(與我的$匹配過濾器的字段)。現在我有良好的表現和相同的表現,尋找和聚合$匹配:)問題解決了。 – Owumaro 2015-02-09 13:04:31