mongodb使用函数一次查找和更新

mongodb使用函数一次查找和更新,mongodb,Mongodb,我问自己,是否有一种方法可以使用mongodb的聚合框架或mapreduce来执行数据计算并直接用结果更新文档字段。例如,文档的外观如下所示: { a: 1, b: 2, result: undefined } 现在我想对集合中的每个文档执行一个过程,并对每个文档的a+b求和,最后将结果存储在文档中,如下所示: { a: 1, b: 2, result: 3 } 也许它可以与mapreduce一起使用,但我不知道如何使用mapreduce更新文

我问自己,是否有一种方法可以使用mongodb的聚合框架或mapreduce来执行数据计算并直接用结果更新文档字段。例如,文档的外观如下所示:

{
    a: 1,
    b: 2,
    result: undefined
}
现在我想对集合中的每个文档执行一个过程,并对每个文档的a+b求和,最后将结果存储在文档中,如下所示:

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

也许它可以与mapreduce一起使用,但我不知道如何使用mapreduce更新文档。有什么建议吗?

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

我建议使用以下方法代替地图缩小:

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(); 
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();