如何使用Node.js和MongoDB / Mongoose减少嵌套在数组中的对象内部的值

时间:2013-09-10 01:55:08

标签: node.js mongodb mongoose

对于Node.js使用moongoose,我正在尝试浏览“STEPS”数组中的每个对象并将stepid减少1.使用下面的模式:

"appid": 1,
"steps": [
            {
                "name": "step4",
                "stepid": 4,
            },
            {
                "name": "step5",
                "stepid": 5,
            }               
         ],
"appname": "myapp"

以下是我尝试使用.update:

的方法
app.db.models.myApps.update(
        {'appid': 1, 'steps.stepid': { $gt: 3 }},
        { $inc: { 'steps.$.stepid': -1 } },
    { multi: true }
);

但我似乎无法让它正常工作。我能够使用代码并让它更新,但它只会更新数组中的1个对象,而我希望它遍历数组中的每个对象并减少1。

我应该将其分解并首先使用find然后更新吗?我中的旧开发者说要做一个for循环,但我知道这不是用节点做的正确方法。

非常感谢任何帮助或建议!谢谢!

1 个答案:

答案 0 :(得分:0)

不幸的是,这似乎是mongodb的一个问题,它不支持它。

Per:How to Update Multiple Array Elements in mongodb

在这里:https://jira.mongodb.org/browse/SERVER-1243

目前解决方法是:

function convertDirectMessages(id, cb) {
    Conversation.collection.update(
        {'messages.context': 'direct'}, 
        {$set:{'messages.$.context': {type:'direct'}}}, 
        {safe:true, multi:true},
        function(err, updated) {
            if (err) return cb(err);
            if (updated) return convertDirectMessages(id, cb);
            cb();
        }
    );
}
convertDirectMessages(posted._id, this);