使用node.js更新mongodb中的子对象

时间:2014-10-26 20:05:18

标签: node.js mongodb

我有以下架构:

friends: [{
    user: { type : mongoose.Schema.Types.ObjectId, ref : 'User' },
    read: Boolean,
    accepted: Boolean 
}]

我想更新阅读字段。我有以下查询:

User.update({_id: user._id, 
             "friends.$._id": {$in: data.friends}
            }, 
            { $set: { "friends.$.read": true }}, 
            false, 
            true,
            function(err, obj) 
                console.log(obj);
            }
);

这适用于一个文档但是当我有两个或更多文档时,只有第一个文档发生更改。

例如:

[{
    user: 'user1', 
    read: true, 
    accepted: false
 }, 
 {
    user: 'user2', 
    read: false, 
    accepted: false
 }]

仅更改了user1。

1 个答案:

答案 0 :(得分:0)

默认情况下,update中的MongoDB命令仅更新一个文档,第一个文档与您的查询匹配。如果要更新所有文档,则必须通过传递选项{ multi: true }来指定它。

我不是Node.js专家,但在您的示例中,我非常确定您将查询的第一个false更改为true(根据此链接: http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html,是multi选项)它将起作用。像这样:

User.update({_id: user._id, 
         "friends.$._id": {$in: data.friends}
        }, 
        { $set: { "friends.$.read": true }}, 
        true, 
        true,
        function(err, obj) 
            console.log(obj);
        }
);  

否则,您可以尝试直接在查询中传递multi选项:

User.update({_id: user._id, 
         "friends.$._id": {$in: data.friends}
        }, 
        { $set: { "friends.$.read": true }}, 
        { multi: true },
        function(err, obj) 
            console.log(obj);
        }
);

我希望这会对你有所帮助。