【问题标题】:MongoDB remove an item from an array inside an array of objectsMongoDB 从对象数组中的数组中删除一个项目
【发布时间】:2016-08-03 10:06:01
【问题描述】:

我有一个如下所示的文档:

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

我想删除registered 数组中的'e3d65a4e-2552-4995-ac5a-3c5180258d87'具有_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 示例似乎都只处理一层嵌套。如何使用我提供的_idsections 数组中的项目的registered 数组中删除匹配条目?

【问题讨论】:

    标签: arrays mongodb mongodb-query subdocument


    【解决方案1】:

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

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

    【讨论】:

    • 这不会删除任何部分中的任何"e3d65a4e-2552-4995-ac5a-3c5180258d87" 实例吗?我只想从特定部分的注册数组中删除该字符串。
    • 好的,经过测试,这似乎可行,但我不知道为什么。它怎么知道只将 $pull 运算符应用于具有匹配 _id 的特定部分?
    • 好吧,我真的像人类一样阅读了$ 的文档。这是有道理的。感谢您的帮助。
    • 如果我必须从该数组@sstyvane 中删除多个元素,该怎么办
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2021-08-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多