0

{ "_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")
                        }
                    ]
                }
            ]
        }
    }
}
1
  • 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 Commented Jan 5, 2021 at 13:23

2 Answers 2

0
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})
Sign up to request clarification or add additional context in comments.

3 Comments

If its working then please mark right this answer @PulakanamDivya
For Delete Case its Working But in fetch case,how can i find particular in that sample Data I tried this query to find this object {Name: "1-SecondLevelArray-SecondObject"} Model.find({"Data.Stage.FirstArray.SecondArray.Name":"1-SecondLevelArray-SecondObject"},{"_id":1,"Data.Stage.FirstArray.$.SecondArray":1}) --this query is giving whole Record , i need only that object for fetch
Model.find({"Data.Stage.FirstArray:{ $elemMatch:{SecondArray:{ $elemMatch:{Name":"1-SecondLevelArray-SecondObject"}}}}},{_id:1,"Data.Stage.FirstArray":1}). In find query you can't limit array obj but i think in aggregate you can use $project with array operators
0

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.

1 Comment

I tried, I'm getting error .Invalid query: Cannot create field 'SecondArray' in element {FirstArray:[{.....}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.