I have a array in mongodb document.
{
_id: 1,
jobs:[
{
_id:1,
time: "08:00",
status: "pending",
user: 'user1'
},
{
_id:2,
time: "09:00",
status: "pending",
user: 'user1'
},
{
_id:3,
time: "07:30",
status: "done",
user: 'user2'
}
]
}
now I have a updated jobs array like this.
jobs:[
{
_id:1,
time: "10:00",
status: "done"
},
{
_id:2,
time: "11:00",
status: "done"
}
]
updated document should like this
{
_id: 1,
jobs:[
{
_id:1,
time: "10:00", // updated
status: "done" // updated
user: 'user1'
},
{
_id:2,
time: "11:00", // updated
status: "done", // updated
user: "user1"
},
{
_id:3,
time: "07:30",
status: "done",
user: 'user2'
}
]
}
I tried using update and $set and no luck so far
how do I update the only the values in the updated array in to the mongodb document? thanks in advance
CodePudding user response:
One option is using an update with a pipeline:
- Add the new data into the document as
newData
- Using a
$map
to loop over thejobs
items, for each item merge it with the matching item innewData
.
db.collection.update(
{_id: 1},
[{$addFields: {
newData: [
{_id: 1, time: "10:00", status: "done"},
{_id: 2, time: "11:00", status: "done"}
]
}
},
{$project: {
jobs: {
$map: {
input: "$jobs",
in: {
$mergeObjects: [
"$$this",
{$arrayElemAt: ["$newData", {$indexOfArray: ["$newData._id", "$$this._id"]}]}
]
}
}
}
}
}
])
See how it works on the playground example