如何设置数组中特定对象的属性? MongoDB的

时间:2013-11-08 07:08:15

标签: javascript mongodb

我有一个mongodb文档,用于project对象:

{
  members: [
    { _id: ObjectId(1), 
      active: true },
    { _id: ObjectId(2),
      active: false }
  ]
}

我想更改project.members[1].active = true,而在初始查询期间只知道ObjectId(2)。有没有办法在不使用findOne并手动循环成员数组并检查ObjectId的等效性的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

这很有效。本节之后的内容可能会在将来发挥作用。

使用http://docs.mongodb.org/manual/reference/operator/update/positional/,我明白了。

db.collection('projects').findAndModify(
  {                                                          // Query
    "_id": ObjectId(id),
    "members._id": ObjectId(user_id) 
  },
  [[]],                                                      // Ordering
  {                                                          // Update parameters
    $set: { "members.$.active": true }
  }, 
  {new: true},                                               // Options
  function(err, project) {
    // do stuff
});

由于$ position运算符选择了第一个查询匹配,因此它$set只是数组中该对象的活动属性。

更新:以下内容无效......目前无法同时使用$pull$push,但是under consideration

"err": "Field name duplication not allowed with modifiers"

我想我可以使用$pull$push来实现我的目标。

db.collection('projects').findAndModify(
  {                                                          // Query
    "_id": ObjectId(id),
    "members": { $elemMatch: { _id: ObjectId(user_id) } } },
  [[]],                                                      // Ordering
  {                                                          // Update parameters
    $pull: { "members": { $elemMatch: { _id: ObjectId(user_id) } } }, 
    $push: { "members": ObjectId(user_id), active: true }
  }, 
  {new: true},                                               // Options
  function(err, project) {
    // do stuff
});

查询的“成员”行是可选的 - 添加此行将限制更新,以便只有members数组中的用户才能更改。如果删除它,则运行它将覆盖或创建新成员。