使用complext结构更新mongodb文档的正确查询是什么?

时间:2015-05-21 11:12:36

标签: mongodb

我的文档结构如下:

{
    "_id" : ObjectId("555d93b52804d78810c20867"),
    "username" : "my user",
    "myClub" : {
        "myPlayers" : [ 
                {
                    "_id" : ObjectId("555d93b52804d78810c20868"),
                    "skill" : 55,
                    "stamina" : 50,
                    "moral" : 100,
                    "pos" : null,
                }, 
                {
                   "_id" : ObjectId("555d93b52804d78810c20868"),
                    "skill" : 55,
                    "stamina" : 50,
                    "moral" : 100,
                    "pos" : null,
                }, 
                ...

我想做这样的更新:

我有5个这样的文档,我想在所有“myPlayers”数组中将技能数55更新为60(当前数字加5),但条件如下:

我希望最大数量更新为100,并且只有那些pos为null的人,这意味着我有这个:

 "_id" : ObjectId("555d93b52804d78810c20868"),
                "skill" : 100,
                "stamina" : 50,
                "moral" : 100,
                "pos" : null

我不想要加5。

我需要申请处理此代码的代码是什么? 当我想在我的所有文档中添加对象时,我有类似的东西:

this.model('User').update({},{ '$push': { 'myClub.myPlayers': {another user obj here }}},{multi:true ,upsert:true},function(err,numEffected){
        console.log('addPlayer, numEffected:',numEffected);
    });

它与那个相似吗?

1 个答案:

答案 0 :(得分:1)

尝试使用给定条件查询myPlayers数组的用户mongoose模型,并使用生成的游标更新每个数组元素的技能字段:

var query = {
    "myClub.myPlayers.pos": {"$eq": null}, 
    "myClub.myPlayers.skill": {"$lt": 100}
}, opts = {};
User.find(query, opts, function (err, res){
    if (err) return handleError(err);
    res.forEach(function (err, doc){
        if (err) return handleError(err);
        for(var i in doc.myClub.myPlayers){
            if(doc.myClub.myPlayers[i].skill < 100){
                doc.myClub.myPlayers[i].skill += 5;
            }
        }
        doc.save();
    });   
});