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
to
kondisi dalam kueri - perbarui bagian, periksa kondisinya,
- jika
from
ditemukan dimessages
array maka:$map
untuk mengulangi loopmessages
array dan periksa kondisi jikafrom
ditemukan kemudian gabungkansubMessages
saat ini array dengan input barusubMessage
menggunakan$concatArrays
,$mergeObjects
untuk menggabungkan objek saat ini dengan objek yang diperbarui
- lain dari tidak ditemukan kemudian gabungkan array objek pesan baru dalam
messages
saat 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 }
)