0

下面的查询增加scoreone

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} }
})

我也许可以使用函数来计算所有这些,但这仍然无助于插入更新的值。我想保持操作的原子性,因此尝试在同一个查询中进行更新。

建议?

4

1 回答 1

1

也许您可以通过aggregatioin, with operator$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}});
});
于 2016-02-28T01:04:04.597 回答