Vadim Fisher
Vadim Fisher

Reputation: 27

How to update a nested object in array that is in the array of object in mongoose

I have Locations collection in MongoDB that includes two documents. Each one of them has its own array of confirmed bookings as objects with Ids. How can I update the object that has _id: c1? Is it possible to do that in a single query?


[{
_id :63233022222222,
title :"Ravenholm",
price: 180,
capacity: 2,
confirmedBookings: [
 {
  _id : r1,
  start: 1663207200000,
  finish: 1663210799999
 },
 {
  _id: r2,
  start: 1663322400000,
  finish: 1663329599999
 }
]
},
{
_id :6323301111111111,
title :"City 17",
price: 360,
capacity: 4,
confirmedBookings: [
 {
  _id : c1,
  start: 1663207200000,
  finish: 1663210799999
 },
 {
  _id: c2,
  start: 1663322400000,
  finish: 1663329599999
 }
]
}]

Upvotes: 0

Views: 191

Answers (2)

Onur Doğan
Onur Doğan

Reputation: 2058

You can use elemMatch to find the elements inside an array, and then update its value.

return await documentName.findOneAndUpdate(
   { 
      confirmedBookings: { $elemMatch: { _id: "c1"} } 
   }, 
   {
      "confirmedBookings.$": newValue
   }
);

Write your schema's name instead of documentName. The newValue should be the object of the new value you want to update.

Hope, it's helpful and clear

Upvotes: 1

lpizzinidev
lpizzinidev

Reputation: 13289

You should be able to query and update the specific object with:

const updated = await Model.findOneAndUpdate(
  { 'confirmedBookings._id': c1 },
  {
    'confirmedBookings.$.start': 'new-start',
    'confirmedBookings.$.finish': 'new-finish',
  },
  { new: true }
);

Upvotes: 1

Related Questions