Laksh Goel
Laksh Goel

Reputation: 169

Unable to update multi level nested document using mongoose

I need to update the the verified field of a specific number in the phone array inside address array of a user document. I used aggregate https://mongoosejs.com/docs/api/aggregate.html#aggregate_Aggregate function when I want to fetch verified phone number data based on based on address. Now I when I am trying to update, I am not sure how to get it done.

I am new to mongodb and mongoose. Can anyone suggest me how do I get over my problem?

My mongo Schema looks like:

User:{
    name:String,
    age:Number,
    address:[
        {
            address_line_one:String,
            city:String,
            phone:[
                {
                    number:String,
                    verified:Boolean
                }
            ]
        }
    ]
}

Upvotes: 0

Views: 496

Answers (1)

Himanshu Sharma
Himanshu Sharma

Reputation: 3010

We can use array filters to update multilevel arrays.

Let's say, we have the following data in DB:

{
    "name" : "Marc",
    "age" : 17,
    "address" : [
        {
            "address_line_one" : "Its address line 1",
            "city" : "its city",
            "phone" : [
                {
                    "number" : "111111111",
                    "verified" : false
                },
                {
                    "number" : "222222222",
                    "verified" : false
                },
                {
                    "number" : "333333333",
                    "verified" : false
                }
            ]
        }
    ]
}

To update the verification status of phone number "111111111", the following query can be used:

db.collection.update(
    {},
    {
        $set:{
            "address.$[addressFilter].phone.$[phoneFilter].verified":true
        }
    },
    {
        "arrayFilters":[
            {
                "addressFilter.phone.number":"111111111",
            },
            {
                "phoneFilter.number":"111111111"
            }
        ],
        "multi":true
    }
)

Output:

{
    "name" : "Marc",
    "age" : 17,
    "address" : [
        {
            "address_line_one" : "Its address line 1",
            "city" : "its city",
            "phone" : [
                {
                    "number" : "111111111",
                    "verified" : true   // Updated
                },
                {
                    "number" : "222222222",
                    "verified" : false
                },
                {
                    "number" : "333333333",
                    "verified" : false
                }
            ]
        }
    ]
}

Here we used two array filters: 'addressFilter', and 'phoneFilter'

  • The address filter filters those elements in 'address' array which have a phone number "111111111" inside any element of phone array
  • The phone filter filters those elements which have a phone number "111111111"

Please refer https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/ for more information on array filters.

Upvotes: 1

Related Questions