如何显示其他字段也在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);
});
而是在你$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
流水线步骤,然后重新命令所需的关键文件。
你能解释我做了什么吗? –
@maliklakhani我已经用一些解释更新了我的答案。 – chridam
您能否提供示例文档和预期输出? – dikesh