0
votes

{ "_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")
                    }
                ]
            }
        ]
    }
}

} This is the sample format of my code. I want to delete this object { "Name": "2-SecondLevelArray-SecondObject", "_id": ObjectId("5fde08d64d28f313acc0c93c") } from this record.

I tried this query

model.update( { $and: [{ "_id": ObjectId("52f504bb2f9dd91186211537") }}, {"Data.Stage.FirstArray.SecondArray._id":ObjectId("5fde08d64d28f313acc0c93c")}] , { $pull:{ "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

EDIT: { "_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")
                        }
                    ]
                }
            ]
        }
    }
}
2
You are doing wrong in your query, finding array with 5fde08d64d28f313acc0c93c id whereas doing $pull operator on different array that is with diff id 5fe1a7a52d8e360ac4093b82 - AartiVerma

2 Answers

0
votes
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})
0
votes

My idea is to filter out those with your given Name field

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

Honestly, I'm not sure it will be working but it worths a try.