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