2016-02-28 103 views
0

以下查询通过one增加score查询和更新Mongo文档

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

也许你可以通过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}}); 
}); 
+0

这不是一个坏主意。我喜欢。 –