2016-02-05 96 views
1

下面是我的代碼。我想查找所有符合聚合方法條件的行。作爲聚合返回我的對象​​數組我想查找匹配此條件的行。我想按排序順序輸入數據。我不得不使用節點js的mongodb排序方法。如何顯示其他字段也在MongoDB中合計

train.aggregate([ 
     {$group : 
      _id :'$trainNo',  
      total : {$max : '$distance' } 
      trainName : {'$first' : '$trainName'} 
     } 
     ]).sort({total : 1}).forEach(function(docs) { 
       // train.find({'distance' : docs.total, 'trainNo' : docs._id}, {trainNo : 1, trainName : 1, distance : 1}).toArray(function (err,data) { 
       // finalResult.push(data); 
       // }) 
     console.log(docs); 
     }); 
+1

您能否提供示例文檔和預期輸出? – dikesh

回答

0

而是在你$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流水線步驟,然後重新命令所需的關鍵文件。

+0

你能解釋我做了什麼嗎? –

+0

@maliklakhani我已經用一些解釋更新了我的答案。 – chridam

相關問題