mongodb使用函数查找并更新为一次

时间:2015-05-26 09:34:32

标签: mongodb

我问自己是否有办法使用mongodb的聚合框架或mapreduce来执行数据计算,并直接用结果更新文档字段。例如,文档看起来像这样:

{
    a: 1,
    b: 2,
    result: undefined
}

现在我想对集合的每个文档执行一个过程,并总结每个文档的一个+ b,最后将结果存储在文档中,如下所示:

{
    a: 1,
    b: 2,
    result: 3
}

也许它适用于mapreduce,但我不知道如何使用mapreduce更新文档。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您无法在更新中引用文档本身。您必须迭代/循环遍历文档并读取所需的值并根据需要进行操作,并使用函数更新每个文档。请参阅此答案以获取示例,或者将此答案用于服务器端eval()。

db.eval(function() { 
        db.collection.find({"add criteria if required"}).forEach(function(document) {
            document.result = document.a + document.b;
            db.collection.save(document);
        });
    });

More details

答案 1 :(得分:0)

我建议mongo bulk update而不是map-reduce,如下所示:

var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;
db.collectionName.find().forEach(function(data) {
    var updoc = {
      "$set": {}
    };
    var myKey = "result";
    updoc["$set"][myKey] = data.a + data.b
      // queue the update
    bulk.find({
      "_id": data._id
    }).update(updoc);
    counter++;
    // Drain and re-initialize every 1000 update statements
    if(counter % 1000 == 0) {
      bulk.execute();
      bulk = db.collectionName.initializeOrderedBulkOp();
    }
  })
  // Add the rest in the queue
if(counter % 1000 != 0) bulk.execute();