合并mongo管道上的输出

时间:2018-02-13 11:44:46

标签: mongodb aggregation-framework

我创建了一个使用mongo的聚合,它将被安排每5分钟运行一次,并将结果添加到输出集合中。问题是,值正在被替换,我想要的是对它们求和。这是第一次运行它后我的集合中的结果文档:

{
    "_id" : {
        "ID" : "ID0001",
        "NAME" : "NAME0001"
    },
    "total_a" : 8.0,
    "total_b" : 2.0,
    "total_c" : 5.0,
    "total_d" : 5.0,
    "TOTAL" : 35.0
}

当我在5分钟后再次运行时,我得到:

{
    "_id" : {
        "ID" : "ID0001",
        "NAME" : "NAME0001"
    },
    "total_a" : 2.0,
    "total_b" : 3.0,
    "total_c" : 3.0,
    "total_d" : 3.0,
    "TOTAL" : 11.0
}

我想要的是在目标中添加值,而不是替换文档。所以,结果文件应该是:

{
    "_id" : {
        "ID" : "ID0001",
        "NAME" : "NAME0001"
    },
    "total_a" : 10.0,
    "total_b" : 5.0,
    "total_c" : 8.0,
    "total_d" : 8.0,
    "TOTAL" : 46.0
}

解决方案可以是$ lookup阶段来加入然后添加值。但是,有没有其他方法可以告诉Mongo不要替换文件并将值加总?

感谢。

1 个答案:

答案 0 :(得分:1)

您可以编写根据聚合结果和更新集合创建的更新查询。

以下代码查询_id并根据聚合值递增值。

db.collection.aggregate([
    aggregation code
]).forEach(function(doc){ 
    var _id = doc._id; 
    var total_a = doc.total_a; 
    db.collection.update({ "_id" : _id },
      { $inc: {"total_a" : total_a } } )
}; 

如果要更新更多行,可以使用批量写入。