Ich bin mir nicht sicher, ob es einen direkten Weg gibt, dies in einer einzigen Abfrage zu tun,
Update mit Aggregationspipeline ab MongoDB v4.2,
$cond
um zu prüfen, ob der Name insubColl
ist Array,- wahre Bedingung, muss mit existierendem Objekt
$map
zusammengeführt werden Um die Schleife zu durchlaufen, prüfen Sie die Bedingung, wenn sie der Bedingung entspricht, und führen Sie dann das neue Datenobjekt mit dem aktuellen Objekt unter Verwendung von$mergeObjects
zusammen - falsche Bedingung, Arrays müssen verknüpft werden, aktueller
subColl
Array und neues Objekt mit$concatArrays
const _id = 123;
const update = { name: 'John', other: 1000 };
Schema.findOneAndUpdate(
{ _id: _id },
[{
$set: {
subColl: {
$cond: [
{ $in: [update.name, "$subColl.name"] },
{
$map: {
input: "$subColl",
in: {
$cond: [
{ $eq: ["$$this.name", update.name] },
{ $mergeObjects: ["$$this", update] },
"$$this"
]
}
}
},
{ $concatArrays: ["$subColl", [update]] }
]
}
}
}]
)