Mongodb

MongoDB:在聚合管道的深處有保證順序嗎?

  • March 26, 2021

我正在嘗試為任意數量的外鍵獲取“頂部”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選項返回有關如何執行管道的資訊。

引用自:https://dba.stackexchange.com/questions/197434