Node.js MongoDB:子数组的Update属性只更新第一个元素
匹配的元素如下所示:Node.js MongoDB:子数组的Update属性只更新第一个元素,node.js,mongodb,mongodb-update,Node.js,Mongodb,Mongodb Update,匹配的元素如下所示: { "_id": { "$oid": "519ebd1cef1fce06f90e3157" }, "from": "Tester2", "to": "Tester", "messages": [ { "username": "Tester2", "message": "heeey", "read": false },
{
"_id": {
"$oid": "519ebd1cef1fce06f90e3157"
},
"from": "Tester2",
"to": "Tester",
"messages": [
{
"username": "Tester2",
"message": "heeey",
"read": false
},
{
"username": "Tester",
"message": "hi!",
"read": false
},
{
"username": "Tester2",
"message": "test",
"read": false
}
],
}
现在,我尝试将read
属性设置为用户名不等于Tester
的子元素的当前日期:
var messages = db.collection('messages');
messages.update(
{
_id: new BSON.ObjectID("519ebd1cef1fce06f90e3157"),
messages: {
$elemMatch: { username: { $ne: "Tester" } }
}
},
{ $set: { 'messages.$.read': new Date() } },
{ multi: true }, function(error, result) {
console.log(error);
console.log(result);
});
但只有第一个消息子元素读取属性更新:
{
"_id": {
"$oid": "519ebd1cef1fce06f90e3157"
},
"from": "Tester2",
"to": "Tester",
"messages": [
{
"username": "Tester2",
"message": "heeey",
"read": {
"$date": "2013-01-01T00:00:00.000Z"
}
},
{
"username": "Tester",
"message": "hi!",
"read": false
},
{
"username": "Tester2",
"message": "test",
"read": false
}
],
}
代码怎么了?
我将node.js v0.10.8和MongoDB v2.4.3与一起使用。您的代码没有问题;包含第一个匹配数组元素的索引。{multi:true}
选项仅使更新应用于多个文档,而不是数组元素。要在单个update
中更新多个数组元素,必须通过数字索引指定它们
所以你必须这样做:
messages.update(
{
_id: new BSON.ObjectID("519ebd1cef1fce06f90e3157")
},
{ $set: {
'messages.0.read': new Date(),
'messages.2.read': new Date()
} },
function (err, result) { ... }
);
这类似于问题:
var集={},i,l;
对于(i=0,l=messages.length;i我认为在这种情况下可以使用ArrayFilter好的,如果我以前不知道索引,我不能不简单地使用消息。$.read
?你需要做一个单独的查询来获得所有的消息,这样你就可以确定索引(显然是一个非常痛苦的问题)。$
将是0(第一个匹配元素的索引),因此它将只引用第一个元素。简言之,MongoDB并不真正支持您尝试执行的操作。听起来您的模式对于您的用例来说不是一个好的选择。
var set = {}, i, l;
for(i=0,l=messages.length;i<l;i++) {
if(messages[i].username != 'tester') {
set['messages.' + i + '.read'] = new Date();
}
}
.update(objId, {$set:set});