这行得通。本节之后的内容将来可能会起作用。
使用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
数组中的用户可以更改。如果它被删除,那么运行它将覆盖或创建一个新成员。