11

我有一个看起来像这样的文档:

{
  "_id" : ObjectId("56fea43a571332cc97e06d9c"),
  "sections" : [
    {
      "_id" : ObjectId("56fea43a571332cc97e06d9e"),
      "registered" : [
        "123",
        "e3d65a4e-2552-4995-ac5a-3c5180258d87"
      ]
    }
  ]
}

我想删除数组中'e3d65a4e-2552-4995-ac5a-3c5180258d87'只有特定部分的.registered_id'56fea43a571332cc97e06d9e'

我目前的尝试是这样的,但它只是返回未修改的原始文档。

db.test.findOneAndUpdate(
{
  $and: [
    {'sections._id': ObjectId('56fea43a571332cc97e06d9e')},
    {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'}
  ]
},
{
  $pull: {
    $and: [
      {'sections._id': ObjectId('56fea43a571332cc97e06d9e')},
      {'sections.registered': 'e3d65a4e-2552-4995-ac5a-3c5180258d87'}
    ]
  }
})

我已经查看了$pull,但我似乎无法弄清楚如何使它在包含另一个数组的嵌套对象数组上工作。这些$pull示例似乎都只处理一层嵌套。如何使用我提供的从registered数组中的项目的数组中sections删除匹配的条目_id

4

1 回答 1

9

您需要使用位置$更新运算符从数组中删除元素。你需要这个是因为“sections”是一个子文档数组。

db.test.findOneAndUpdate(
    { "sections._id" : ObjectId("56fea43a571332cc97e06d9e") }, 
    { "$pull": { "sections.$.registered": "e3d65a4e-2552-4995-ac5a-3c5180258d87" } } 
)
于 2016-04-12T17:21:47.143 回答