0

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

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

我想更改,而仅在初始查询期间project.members[1].active = true知道。ObjectId(2)有没有办法在不使用findOne和手动循环成员数组并检查 ObjectId 的等价性的情况下做到这一点?

4

1 回答 1

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
});

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

更新:以下不会工作......但是。$pull并且$push目前不能同时使用,但正在考虑中。

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

我想我可以使用 a$pull和 a$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数组中的用户可以更改。如果它被删除,那么运行它将覆盖或创建一个新成员。

于 2013-11-08T07:20:32.733 回答