Upsert virker ikke i indlejrede dokumenter i opdateringsforespørgsel,
Du kan prøve en kompleks opdatering med en aggregeringsforespørgsel til at håndtere dine sager, hvis du vil gøre det i en enkelt forespørgsel,
Lad os tage et eksempel på input og se eksempler på case-wise,
Case 1: Hvis angivet messages.from
feltet findes i messages
array
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Case 2: Hvis messages.from
felt findes ikke i array
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Case 3: Hvis dokumentet ikke findes
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Din sidste forespørgsel ville være,
- marker kun
to
tilstand i forespørgslen - opdater del, tjek tilstanden,
- hvis
from
findes imessages
array derefter:$map
at gentage loop afmessages
array og kontroller tilstanden hvisfrom
fundet og derefter sammenknytte aktuellesubMessages
array med ny inputsubMessage
ved hjælp af$concatArrays
,$mergeObjects
for at flette nuværende objekt med opdateret objekt
- andet fra ikke fundet, så sammensæt nyt meddelelsesobjekt-array i aktuelle
messages
array ved hjælp af$cocnatArrays
- hvis
upsert: true
, for at indsætte nyt dokument, hvis det ikke findes i samlingen
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 }
)