Не съм сигурен дали има някакъв пряк начин да направя това в една заявка,
Актуализиране с тръбопровод за агрегиране започвайки от MongoDB v4.2,
$cond
за да проверите дали името е вsubColl
масив,- вярно условие, трябва да се слее със съществуващ обект,
$map
за повторение на цикъла, проверете условието, ако съвпада с условието, след това обединете нов обект с данни с текущия обект, като използвате$mergeObjects
- фалшиво условие, трябва да се свържат масиви, текущ
subColl
масив и нов обект с помощта на$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]] }
]
}
}
}]
)