如何从嵌套文档数组中的项目中删除数组值

时间:2013-11-29 16:12:28

标签: mongodb

我想仅为“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条件下“反向引用”?

1 个答案:

答案 0 :(得分:1)

您需要在查询对象中使用$elemMatch,以便只有_idtags部分匹配同一元素才会匹配:

db.test.update({
  users: {$elemMatch: {_id: "user3", tags: {$in: ["tag4"]}}}
}, {
  $pullAll: {
    "users.$.tags": ["tag4"]
  }
}, {
  multi: 1
})