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
totilstand i forespørgslen - opdater del, tjek tilstanden,
- hvis
fromfindes imessagesarray derefter:$mapat gentage loop afmessagesarray og kontroller tilstanden hvisfromfundet og derefter sammenknytte aktuellesubMessagesarray med ny inputsubMessageved hjælp af$concatArrays,$mergeObjectsfor at flette nuværende objekt med opdateret objekt
- andet fra ikke fundet, så sammensæt nyt meddelelsesobjekt-array i aktuelle
messagesarray 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 }
)