我想仅为“user3”删除“tag4”:
{
_id: "doc"
some: "value",
users: [
{
_id: "user3",
someOther: "value",
tags: [
"tag4",
"tag2"
]
}, {
_id: "user1",
someOther: "value",
tags: [
"tag3",
"tag4"
]
}
]
},
{
...
}
注意:此集合包含引用许多用户的项目。用户存储在不同的集合中。每个用户的唯一标记也存储在users集合中。如果用户从其帐户中删除了一个标记(或多个标记),则应从所有项目中删除该标记。
我尝试了此查询,但它删除了所有用户的“tag4”:
{
"users._id": "user3",
"users.tags": {
$in: ["tag4"]
}
}, {
$pullAll: {
"users.$.tags": ["tag4"]
}
}, {
multi: 1
}
我在选择器中尝试了$ elemMatch(和$和),但最终只在第一个匹配的文档上得到了相同的结果,或者注意到发生了一些奇怪的事情(有时候其他用户的所有标签都被删除了)。
任何想法如何解决这个问题?有没有办法在$ pull条件下“反向引用”?
答案 0 :(得分:1)
您需要在查询对象中使用$elemMatch
,以便只有_id
和tags
部分匹配同一元素才会匹配:
db.test.update({
users: {$elemMatch: {_id: "user3", tags: {$in: ["tag4"]}}}
}, {
$pullAll: {
"users.$.tags": ["tag4"]
}
}, {
multi: 1
})