如何显示其他字段也在MongoDB中合计

问题描述:

下面是我的代码。我想查找所有符合聚合方法条件的行。作为聚合返回我的对象​​数组我想查找匹配此条件的行。我想按排序顺序输入数据。我不得不使用节点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

而是在你$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