我问自己是否有办法使用mongodb的聚合框架或mapreduce来执行数据计算,并直接用结果更新文档字段。例如,文档看起来像这样:
{
a: 1,
b: 2,
result: undefined
}
现在我想对集合的每个文档执行一个过程,并总结每个文档的一个+ b,最后将结果存储在文档中,如下所示:
{
a: 1,
b: 2,
result: 3
}
也许它适用于mapreduce,但我不知道如何使用mapreduce更新文档。有什么建议吗?
答案 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);
});
});
答案 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();