単一のクエリでこれを行う簡単な方法があるかどうかはわかりません
集計パイプラインで更新 MongoDBv4.2以降
-
$cond
名前を確認するには、subColl
にあります 配列、 - 真の条件、既存のオブジェクト
$map
とマージする必要があります ループを繰り返すには、条件が一致するかどうかを確認してから、$mergeObjects
を使用して新しいデータオブジェクトを現在のオブジェクトとマージします - false条件、配列を連結する必要がある、現在の
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]] }
]
}
}
}]
)