查询和更新Mongo文档

时间:2016-02-28 00:01:24

标签: mongodb spring-data mongodb-query spring-mongodb

以下查询会将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} }
})

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

连连呢?

1 个答案:

答案 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}});
});