【问题标题】:MongoDB. Remove subelement from array using parent elements for query [duplicate]MongoDB。使用查询的父元素从数组中删除子元素[重复]
【发布时间】:2021-02-18 23:22:39
【问题描述】:

这是我的集合对象结构

"_id" : ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"),
"Name": "HelloWorld",
"OtherFields": "OtherValues",
"Projects" : [ 
    {
        "Project" : {
            "key" : 111
        },
        "Category" : [ 
            {
                "No" : "123"
            }, 
            {
                "No" : "987"
            }
        ]
    },
    {
        "Project" : {
            "key" : 222
        },
        "Category" : [ 
            {
                "No" : "123"
            }, 
            {
                "No" : "987"
            }
        ]
    }
]

我想删除项目中键为 111 的类别编号「123」的元素

我做的更接近的事情是

db.project_collection.updateOne({"_id": ObjectId("collection_obj_id")}, {"$pull": { "Projects": {"$and": [ {"Project.key": 111)}, {"Category.No": "123"} ] }} })

Live example

此命令删除 "Projects" 对象内的整个元素

但我只想删除 "Projects""Category"[0] 没有 123 的子元素。

当我尝试将"$pull" 之后的"Projects" 更改为"Projects.Category""Projects.$.Category" 之类的东西时

The positional operator did not find the match needed from the query

发生错误。

那么是否可以在不创建自己的后端逻辑的情况下删除子元素?

【问题讨论】:

  • 您需要使用数组更新运算符positional $
  • 我已经尝试过 Projects.$, Projects.$.Category.$, Projects.Category.$, Projects.$.Category 没有运气
  • 是的,你可以试试下面 J.F 的答案。另一个例子 here 使用 $pull
  • 标记重复项中的一个答案指示db.collection.update({ _id: "xxxxxxxxxxxxxxxxxxxxxxxx" }, { $pull: { "Projects.$[elem].Category": { "No": "123" } } }, { arrayFilters: [ { "elem.Project.key": 111 } ] })形式的解决方案

标签: mongodb


【解决方案1】:

知道project.keycategory.no 你可以使用这个查询:

db.collection.update({
  "_id": 1,
  "Projects.Project.key": 111
},
{
  "$pull": {
    "Projects.$.Category": {
      "No": "123"
    }
  }
})

在更新后的 JSON 中,$ 运算符被加入。

此查询基本上指向带有key: 111_id: 1 的文档,并使用$ 执行pull。 所以它会pull 匹配no: "123" 的'pointed' 元素。

更新示例here

我添加了另一个带有_id: 2 的文档,以检查是否只有带有_id:1 的文档被更新。

【讨论】:

  • 不走运 :( WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) 我可以使用 {"project.key": 111} 来查找元素,但即使我找到它我也无法更改
  • 抱歉,我的问题中的 JSON 数据有点不完整。添加键以便更好地理解。您示例中的数据略有不同
  • 用新的 JSON 格式更新了答案。希望对您有所帮助。
  • 太棒了!谢谢!实际上我需要更新特定的 object_id,所以你可以像这样编辑你的答案查询mongoplayground.net/p/KoMHSFcQyUf 我会检查你的答案是否正确
  • 答案已更新:)
猜你喜欢
  • 2018-11-10
  • 2017-12-22
  • 1970-01-01
  • 2018-12-18
  • 2011-07-03
  • 2015-06-12
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多