以下查询会将score
增加one
。
db.people.findAndModify({
query: { name: "Andy" },
update: { $inc: { score: 1 } }
})
但是,是否可以做更多而不仅仅是增加score
。我想为同一文档增加score
并计算avg_field
。
db.people.findAndModify({
query: { name: "Andy" },
update: { $inc: { score: 1 }, avg_field : {x divide by new score value} }
})
我或许可以使用函数来计算所有这些,但仍然无法帮助插入更新的值。我想保持操作原子,因此尝试在同一查询中更新。
连连呢?
答案 0 :(得分:1)
也许您可以通过aggregatioin
执行此操作,操作符$add
和$divide
如下所示。但是,聚合不会更新文档,因此您应该从聚合返回游标,然后逐个更新文档。以下是示例代码。
// increase score than compute the avg_field, then return the cursor.
var cur = db.people.aggregate([
{$match: { name: "Andy" }},
{ "$project":
{
"_id": "$_id",
"score": {$add: ['$score', 1]}, // add score by 1
"avg_field": {$divide: ['$v1', {$add: ['$score', 1]}]} // compute the new avg_field
}
}
]);
// Iterate through results and update each people.
cur.forEach(function(doc) {
var doc = cur.next();
db.people.update({ _id: doc._id },
{ "$set": { avg_field: doc.avg_field, score: doc.score}});
});