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ó trongsubColl
mả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,
subColl
hiệ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]] }
]
}
}
}]
)