【问题标题】:How to remove obejct from multi level array in nodejs using mongo?如何使用 mongodb 从节点 js 中的多级数组中删除对象?
【发布时间】:2023-03-31 08:05:01
【问题描述】:

{ "_id" : ObjectId("52f504bb2f9dd91186211537"),

"Data": {

    "Stage": {

        "FirstArray": [
            {
                "Name": "FirstLevelArray-FirstObject",
                "_id": ObjectId("5fe1a5fa2d8e360ac4093b7e"),
                "SecondArray": [
                    {
                        "Name": "1-SecondLevelArray-FirstObject",
                        "_id": ObjectId("5fe1a7a52d8e360ac4093b81")
                    },
                    {
                        "Name": "1-SecondLevelArray-SecondObject",
                        "_id": ObjectId("5fe1a7a52d8e360ac4093b82")
                    }
                ]
            },
            {
                "Name": "FirstLevelArray-SecondObject",
                "_id": ObjectId("5fdc9dced45fa417d417c441"),
                "SecondArray": [
                    {
                        "Name": "2-SecondLevelArray-FirstObject",
                        "_id": ObjectId("5fde08564d28f313acc0c93b")
                    },
                    {
                        "Name": "2-SecondLevelArray-SecondObject",
                        "_id": ObjectId("5fde08d64d28f313acc0c93c")
                    }
                ]
            }
        ]
    }
}

} 这是我的代码的示例格式。 我想从这条记录中删除这个对象 { "Name": "2-SecondLevelArray-SecondObject", "_id": ObjectId("5fde08d64d28f313acc0c93c") }。

我试过这个查询

模型.更新( { $and: [{ "_id": ObjectId("52f504bb2f9dd91186211537") }}, {"Data.Stage.FirstArray.SecondArray._id":ObjectId("5fde08d64d28f313acc0c93c")}] , { $拉:{ "Data.Stage.FirstArray.$.SecondArray._id": ObjectId("5fe1a7a52d8e360ac4093b82") } }, {new:true,upsert:false})

How would I achieve this in MongoDB ?


Here is the expected result of find({"_id" : ObjectId("52f504bb2f9dd91186211537")}) after the update

编辑:{ "_id" : ObjectId("52f504bb2f9dd91186211537"),

    "Data": {

        "Stage": {

            "FirstArray": [
                {
                    "Name": "FirstLevelArray-FirstObject",
                    "_id": ObjectId("5fe1a5fa2d8e360ac4093b7e"),
                    "SecondArray": [
                        {
                            "Name": "1-SecondLevelArray-FirstObject",
                            "_id": ObjectId("5fe1a7a52d8e360ac4093b81")
                        },
                        {
                            "Name": "1-SecondLevelArray-SecondObject",
                            "_id": ObjectId("5fe1a7a52d8e360ac4093b82")
                        }
                    ]
                },
                {
                    "Name": "FirstLevelArray-SecondObject",
                    "_id": ObjectId("5fdc9dced45fa417d417c441"),
                    "SecondArray": [
                        {
                            "Name": "2-SecondLevelArray-FirstObject",
                            "_id": ObjectId("5fde08564d28f313acc0c93b")
                        }
                    ]
                }
            ]
        }
    }
}

【问题讨论】:

  • 您在查询中做错了,查找 id 为 5fde08d64d28f313acc0c93c 的数组,而在不同的数组上执行 $pull 运算符,其 diff id 为 5fe1a7a52d8e360ac4093b82

标签: mongodb


【解决方案1】:
model.update({ _id: ObjectId("52f504bb2f9dd91186211537"), Data.Stage.FirstArray:{ $elemMatch: { SecondArray:{$elemMatch:{"_id":ObjectId("5fde08d64d28f313acc0c93c")}}}}},
           { $pull:{ "Data.Stage.FirstArray.$.SecondArray":{"_id": ObjectId("5fde08d64d28f313acc0c93c") }}},{new:true,upsert:false})

【讨论】:

  • 如果它工作,那么请标记正确这个答案@PulakanamDivya
  • 对于删除案例其工作但在获取案例中,我如何在该示例数据中找到特定的我尝试此查询以查找此对象 {Name: "1-SecondLevelArray-SecondObject"} Model.find( {"Data.Stage.FirstArray.SecondArray.Name":"1-SecondLevelArray-SecondObject"},{"_id":1,"Data.Stage.FirstArray.$.SecondArray":1}) --此查询给出整个记录,我只需要那个对象来获取
  • Model.find({"Data.Stage.FirstArray:{ $elemMatch:{SecondArray:{ $elemMatch:{Name":"1-SecondLevelArray-SecondObject"}}}}},{_id :1,“Data.Stage.FirstArray”:1})。在查找查询中,您不能限制数组 obj,但我认为总的来说您可以将 $project 与数组运算符一起使用
【解决方案2】:

我的想法是用你给定的Name 字段过滤掉那些

model.updateMany({}, {
    $set: { "Data.Stage.FirstArray.SecondArray": { $filter: {
        input: "$Data.Stage.FirstArray.SecondArray",
        as: "item",
        cond: { $eq: [ "$$item.Name", '2-SecondLevelArray-SecondObject' ] }
     } } },
});

老实说,我不确定它是否会起作用,但值得一试。

【讨论】:

  • 我试过了,我收到错误。无效查询:无法在元素 {FirstArray:[{.....} 中创建字段“SecondArray”
猜你喜欢
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多