Dav*_*vid 2 mongodb node.js mongodb-update
匹配元素看起来像:
{
"_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
}
],
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试将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);
});
Run Code Online (Sandbox Code Playgroud)
但只是第一个消息子元素read属性更新:
{
"_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
}
],
}
Run Code Online (Sandbox Code Playgroud)
代码有什么问题?我正在使用node.js v0.10.8和MongoDB v2.4.3以及node-mongodb-native.
Joh*_*yHK 11
你的代码没有错; 的$操作者包含的索引第一匹配的数组元素.该{multi: true}选项仅update适用于多个文档,而不是数组元素.要在单个数组元素中更新多个数组元素,update必须通过数字索引指定它们.
所以你必须做这样的事情:
messages.update(
{
_id: new BSON.ObjectID("519ebd1cef1fce06f90e3157")
},
{ $set: {
'messages.0.read': new Date(),
'messages.2.read': new Date()
} },
function (err, result) { ... }
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4966 次 |
| 最近记录: |