而是在你$group
步驟中使用$max
運營商,使用$first
操作,這樣就可以延長你的聚集與要返回的字段$group
管道的一步。當您在分組階段之前對最初的管道文檔進行排序時,此功能效果最佳。
最後的$sort
管道階段將用於訂購您的結果文件。下面展示瞭如何去了解這一點:
var pipeline = [
{ "$sort": { "distance": -1 } },
{
"$group": {
"_id": "$trainNo",
"total": { "$first": "$distance" },
"trainName": { "$first": "$trainName" },
"distance": { "$first": "$distance" },
"id": { "$first": "$_id" }
}
},
{
"$project": {
"_id": "$id",
"trainNo": "$_id",
"total": 1,
"trainName": 1,
"distance": 1
}
},
{ "$sort": { "total": -1 } }
]
train.aggregate(pipeline, function(err, r){
console.log(r);
})
在上面的管道,第一步是$sort
運營商這類似於SQL的ORDER BY
條款。要按降序對特定字段進行排序,請指定-1,如果該字段必須按升序排序,請指定1。 在你的情況下,它是按照distance
字段降序進行排序。這是下一個流水線階段的必要操作,步驟如下:$group
步驟,您需要通過在分組文檔訂購時從第一個/頂部文檔獲取值,獲得每個分組文檔的最大值distance
。
在這裏需要注意的一件事是執行一個管道時,MongoDB將管道操作符互相管道。這裏的「管道」採用Linux的含義:操作員的輸出成爲後面的操作員的輸入。每個操作員的結果都是一個新的文檔集合。所以蒙戈執行以前的管道如下:
collection | $sort | $group | $project | $sort => result
裏面的$group
管道,你現在通過trainNo
場分組有序的文件,然後使用蓄能器返回的分組文件所需的聚集。累加器運算符$first
在此分組操作中是理想的,因爲它在文檔處於已定義順序時從每個組的第一個文檔返回一個值,在這種情況下,您將它們按距離遞減排序。在$group
階段使用
蓄電池維持其狀態(例如總計,最大值,最小值,和有關的數據)作爲文件通過管道進步。
要獲得所需的字段的文件中,$project
運營商這類似於SQL SELECT
用於重命名字段名稱和選擇/取消的字段要返回,出了分組字段。如果您爲某個字段指定0,則不會將其發送到下一個運算符的管道中。
最後的$sort
流水線步驟,然後重新命令所需的關鍵文件。
您能否提供示例文檔和預期輸出? – dikesh