Upsert няма да работи във вложени документи в заявка за актуализиране,
Можете да опитате сложна актуализация със заявка за обобщаване, за да обработите вашите случаи, ако искате да го направите в една заявка,
Нека да вземем пример за въвеждане и да видим примерни малки и големи букви,
Случай 1: Ако е посочено messages.from
полето съществува в messages
масив
var to = "111";
var from = "222";
var subMessage = {
message: "test",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Случай 2: Ако messages.from
полето не съществува в масив
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Случай 3: Ако документът не съществува
var to = "111";
var from = "333";
var subMessage = {
message: "test2",
date: ISODate("2021-06-29T15:57:53.975Z")
};
Последното ви запитване ще бъде,
- проверете само
to
условие в заявката - актуализирайте частта, проверете състоянието,
- ако
from
намерени вmessages
масив след това:$map
за итериране на цикъл отmessages
масив и проверете условието, акоfrom
намери след това свържете текущитеsubMessages
масив с нов входsubMessage
използвайки$concatArrays
,$mergeObjects
за обединяване на текущия обект с актуализирания обект
- друго от не е намерено, след това свържете нов обектен масив от съобщения в текущите
messages
масив с помощта на$cocnatArrays
- ако
upsert: true
, за вмъкване на нов документ, ако не е намерен в колекцията
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 }
)