Tôi không chắc có cách nào dễ dàng để thực hiện việc này trong một truy vấn duy nhất,
Cập nhật bằng đường dẫn tổng hợp bắt đầu từ MongoDB v4.2,
-
$condđể kiểm tra tên có trongsubCollmảng, - tình trạng đúng, cần hợp nhất với đối tượng hiện có,
$mapđể lặp lại vòng lặp, kiểm tra điều kiện nếu khớp với điều kiện sau đó hợp nhất đối tượng dữ liệu mới với đối tượng hiện tại bằng cách sử dụng$mergeObjects - điều kiện sai, cần nối các mảng,
subCollhiện tại mảng và đối tượng mới bằng cách sử dụng$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]] }
]
}
}
}]
)