Upsert werkt niet in geneste documenten in updatequery,
U kunt een complexe update proberen met een aggregatiequery om uw zaken af te handelen als u dit in één query wilt doen,
Laten we een voorbeeldinvoer nemen en een voorbeeld per geval bekijken,
Geval 1: Indien gespecificeerd messages.from
veld bestaat in messages
reeks
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Geval 2: Als messages.from
veld bestaat niet in array
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Geval 3: Als document niet bestaat
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Uw laatste vraag zou zijn:
- vink alleen
to
aan voorwaarde in zoekopdracht - deel updaten, controleer de staat,
- if
from
gevonden inmessages
array dan:$map
herhaling vanmessages
array en controleer de voorwaarde alsfrom
gevonden en concat huidigesubMessages
array met nieuwe invoersubMessage
met behulp van$concatArrays
,$mergeObjects
om het huidige object samen te voegen met het bijgewerkte object
- anders van niet gevonden dan concat nieuwe berichtobjectarray in huidige
messages
array met behulp van$cocnatArrays
- if
upsert: true
, om een nieuw document in te voegen als het niet in de verzameling staat
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 }
)