Upsert tidak akan berfungsi dalam dokumen bersarang dalam kueri pembaruan,
Anda dapat mencoba pembaruan kompleks dengan kueri agregasi untuk menangani kasus Anda jika Anda ingin melakukannya dalam satu kueri,
Mari kita ambil contoh masukan dan lihat contoh kasusnya,
Kasus 1: Jika ditentukan messages.from kolom ada di messages larik
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Kasus 2: Jika messages.from bidang tidak ada dalam larik
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Kasus 3: Jika dokumen tidak ada
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Permintaan terakhir Anda adalah,
- hanya centang
tokondisi dalam kueri - perbarui bagian, periksa kondisinya,
- jika
fromditemukan dimessagesarray maka:$mapuntuk mengulangi loopmessagesarray dan periksa kondisi jikafromditemukan kemudian gabungkansubMessagessaat ini array dengan input barusubMessagemenggunakan$concatArrays,$mergeObjectsuntuk menggabungkan objek saat ini dengan objek yang diperbarui
- lain dari tidak ditemukan kemudian gabungkan array objek pesan baru dalam
messagessaat ini array menggunakan$cocnatArrays
- jika
upsert: true, untuk menyisipkan dokumen baru jika tidak ditemukan dalam koleksi
db.pendingMessages.updateOne(
{ to: to },
[{
$set: {
messages: {
$cond: [
{ $in: [from, { $ifNull: ["$messages.from", []] }] },
{
$map: {
input: "$messages",
in: {
$mergeObjects: [
"$$this",
{
subMessages: {
$cond: [
{ $eq: ["$$this.from", from] },
{
$concatArrays: ["$$this.subMessages", [subMessage]]
},
"$$this.subMessages"
]
}
}
]
}
}
},
{
$concatArrays: [
{ $ifNull: ["$messages", []] },
[
{
from: from,
subMessages: [subMessage]
}
]
]
}
]
}
}
}],
{ upsert: true }
)