How to update nested array value in mongoose

3.2k Views Asked by At

How can i update nested arrays value using express and mongoose where is a multi-dimensional array and need to update a single object keys value. Here is my data model

{
"_id" : ObjectId("5847b92a20352925039432de"),
"user" : {
    "email" : "[email protected]",
    "fullName" : "Name"
}
"availabilities" : [
    [
        {
            "status" : "Close",
            "end" : "03:00",
            "start" : "00:00",
            "day" : "Sunday",
            "id" : "Sunday00:00"
        },
        {
            "status" : "Close",
            "end" : "06:00",
            "start" : "03:00",
            "day" : "Sunday",
            "id" : "Sunday03:00"
        },
        {
            "status" : "Open",
            "end" : "09:00",
            "start" : "06:00",
            "day" : "Sunday",
            "id" : "Sunday06:00"
        },
        {
            "status" : "Open",
            "end" : "12:00",
            "start" : "09:00",
            "day" : "Sunday",
            "id" : "Sunday09:00"
        },
        {
            "status" : "Open",
            "end" : "15:00",
            "start" : "12:00",
            "day" : "Sunday",
            "id" : "Sunday12:00"
        },
        {
            "status" : "Open",
            "end" : "18:00",
            "start" : "15:00",
            "day" : "Sunday",
            "id" : "Sunday15:00"
        },
        {
            "status" : "Open",
            "end" : "21:00",
            "start" : "18:00",
            "day" : "Sunday",
            "id" : "Sunday18:00"
        },
        {
            "status" : "Open",
            "end" : "24:00",
            "start" : "21:00",
            "day" : "Sunday",
            "id" : "Sunday21:00"
        }
    ],
    [
        {
            "status" : "Close",
            "end" : "03:00",
            "start" : "00:00",
            "day" : "Monday",
            "id" : "Monday00:00"
        },
        {
            "status" : "Close",
            "end" : "06:00",
            "start" : "03:00",
            "day" : "Monday",
            "id" : "Monday03:00"
        },
        {
            "status" : "Open",
            "end" : "09:00",
            "start" : "06:00",
            "day" : "Monday",
            "id" : "Monday06:00"
        },
        {
            "status" : "Open",
            "end" : "12:00",
            "start" : "09:00",
            "day" : "Monday",
            "id" : "Monday09:00"
        },
        {
            "status" : "Open",
            "end" : "15:00",
            "start" : "12:00",
            "day" : "Monday",
            "id" : "Monday12:00"
        },
        {
            "status" : "Open",
            "end" : "18:00",
            "start" : "15:00",
            "day" : "Monday",
            "id" : "Monday15:00"
        },
        {
            "status" : "Open",
            "end" : "21:00",
            "start" : "18:00",
            "day" : "Monday",
            "id" : "Monday18:00"
        },
        {
            "status" : "Open",
            "end" : "24:00",
            "start" : "21:00",
            "day" : "Monday",
            "id" : "Monday21:00"
        }
    ]
]

}

Here I wanted to change 1st index from availabilities array then the 1st indexed object status key value. which is: { "status" : "Close", "end" : "03:00", "start" : "00:00", "day" : "Sunday", "id" : "Sunday00:00" }

2

There are 2 best solutions below

3
On

You can use the positional $ operator or the index number to target array entries.

db.students.update(
   { _id: 4, "grades.grade": 85 },
   { $set: { "grades.$.std" : 6 } }
)
1
On
yourMoongosemodel.findByIdAndUpdate(id : giveId, 
 { $push: {
         availabilities[0].status : 'open'
          }
 }, {new : true}, function(err, data){
 console.log(data);
  } )