2014-10-26 70 views
0

我有以下模式:更新子对象与node.js的

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 
}] 

仅改变用户1。

回答

0

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

我不是Node.js专家,但在你的例子我敢肯定,如果你改变你的查询的第一falsetrue(其中,根据此链接: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); 
     } 
); 

我希望这会帮助你。

+1

看来他在使用Mongoose,而您引用了node-mongo-native doc。那么,它仍然适用,虽然:) – yaoxing 2014-10-27 02:23:32

+0

@yaoxing谢谢你指出了!正如我所说,我不是一个专家,但它似乎与我的第二个查询不太远:http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html;) – jbihan 2014-10-27 12:09:42

+0

嗯,我猜是什么他的意思是他需要更新字段“friends”中的每个元素。恐怕这是不可能的。查看[JIRA问题](https://jira.mongodb.org/browse/SERVER-1243) – yaoxing 2014-10-28 02:01:39