我有一个mongodb文档,用于project
对象:
{
members: [
{ _id: ObjectId(1),
active: true },
{ _id: ObjectId(2),
active: false }
]
}
我想更改project.members[1].active = true
,而在初始查询期间只知道ObjectId(2)
。有没有办法在不使用findOne
并手动循环成员数组并检查ObjectId的等效性的情况下执行此操作?
答案 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
数组中的用户才能更改。如果删除它,则运行它将覆盖或创建新成员。