Upsert nebude fungovat ve vnořených dokumentech v aktualizačním dotazu,
Můžete zkusit složitou aktualizaci s agregačním dotazem pro zpracování vašich případů, pokud to chcete udělat v jediném dotazu,
Vezměme si příklad vstupu a podívejme se na příklad,
Případ 1: Pokud je zadáno messages.from pole existuje ve messages pole
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Případ 2: Pokud messages.from pole v poli neexistuje
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Případ 3: Pokud dokument neexistuje
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Váš poslední dotaz by byl,
- zaškrtněte pouze
topodmínka v dotazu - aktualizovat část, zkontrolovat stav,
- pokud
fromnaleznete vemessagespole pak:$mapiterovat smyčkumessagespole a zkontrolujte podmínku, pokudfromnalezen a poté concat aktuálnísubMessagespole s novým vstupemsubMessagepomocí$concatArrays,$mergeObjectske sloučení aktuálního objektu s aktualizovaným objektem
- jinak z nenalezeno, pak spojte nové pole objektů zprávy v aktuálních
messagespole pomocí$cocnatArrays
- pokud
upsert: true, vložit nový dokument, pokud nebyl nalezen ve sbírce
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 }
)