I have an object that looks like this.
{
_id: '577fe7a842c9b447',
name: 'Jacob\'s Bronze Badges',
competitors: [
{
_id: '577fe7a842c9bd6d',
name: 'Peter\'s Silver Badges',
sites: [
{
_id: '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/peter'
},
{
_id: '577fe7a842c9bd6d'
name: 'Google',
url: 'google.com/peter'
}
]
},
{
_id: '599fe7a842c9bd6d',
name: 'Paul\'s Gold Badges',
sites: [
{
'_id': '577fe7a842c9bd6d',
name: 'Facebook',
url: 'fb.com/paul'
},
{
_id: '577fe7a842c9bd6d',
name: 'Google',
url: 'google.com/paul'
}
]
}
]
}
My goal is to reference the competitors
array and update items inside with all of the values from req.body
. I based this code off of this answer, as well as this other one.
Location.update(
{ 'competitors._id': req.params.competitorId, },
{ $set: { 'competitors.$': req.body, }, },
(err, result) => {
if (err) {
res.status(500)
.json({ error: 'Unable to update competitor.', });
} else {
res.status(200)
.json(result);
}
}
);
I send my HTTP PUT
to localhost:3000/competitors/577fe7a842c9bd6d
to update Peter's Silver Badges. The request body is:
{
"name": "McDonald's"
}
The problem is that when I use $set
to set the competitor with _id: req.params.competitorId
, I don't know what is in req.body
. I want to use the entire req.body
to update the object in the array, but when I do, that object is overwritten, so instead of getting a new name, Peter's Silver Badges becomes:
{
name: 'McDonald\'s',
sites: []
}
How can I update an object within an array when I know the object's _id
with all of the fields from req.body
without removing fields that I want to keep?
I believe that the sites
array is empty because the object was reinitialized. In my schema I have sites: [sitesSchema]
to initialize it. So I am assuming that the whole competitors[_id]
object is getting overwritten with the new name and then the sites: [sitesSchema]
from myschema.