Mongodb
MongoDB:在聚合管道的深處有保證順序嗎?
我正在嘗試為任意數量的外鍵獲取“頂部”2 個項目,並按某個鍵排序。我所擁有的是以下內容,這似乎有效:
db.getCollection('col1').aggregate([ {$match: {fk: {$in: [1, 2]}}} {$sort: {name: -1}}, {$group: {_id: "$fk", items: {$push: "$$ROOT"} }}, {$project: {items: {$slice: ["$items", 2]} }} ])
我的問題是:當我在聚合的最後一步
$sort
深入到$slice
內部時,MongoDB 是否保證我在聚合的第二步中應用的排序將保持不變?$project
我看到的數據表明 MongoDB 目前正在以這種方式執行,但我想知道這是否是規範的,或者如果優化器決定這對這樣做。
您的結論是正確的:內部優化或實施細節可能會根據階段改變結果的順序。
該
$group
階段故意不保持秩序,因此您不能依賴觀察行為。如 SERVER-24799 討論中所述:$group 聚合命令應維護MongoDB 問題跟踪器中的文件順序:
不保留順序的原因是我們使用從 到累積值的映射來跟踪所有組
_id
,以便我們可以快速查找傳入文件屬於哪個組。根據聚合管道優化,一些管道階段也可以合併或重新排序為具有改進性能的等效管道。您可以使用該
explain:true
選項返回有關如何執行管道的資訊。