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
to
podmínka v dotazu - aktualizovat část, zkontrolovat stav,
- pokud
from
naleznete vemessages
pole pak:$map
iterovat smyčkumessages
pole a zkontrolujte podmínku, pokudfrom
nalezen a poté concat aktuálnísubMessages
pole s novým vstupemsubMessage
pomocí$concatArrays
,$mergeObjects
ke sloučení aktuálního objektu s aktualizovaným objektem
- jinak z nenalezeno, pak spojte nové pole objektů zprávy v aktuálních
messages
pole 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 }
)