С MongoDB 4.2 и по-нови, методът за актуализиране вече може да вземе документ или агрегиран тръбопровод където могат да се използват следните етапи:
$addFields
и неговия псевдоним$set
$project
и неговия псевдоним$unset
$replaceRoot
и неговия псевдоним$replaceWith
.
Въоръжени с горното, вашата операция за актуализиране с обобщения конвейер ще бъде да замени tags
поле чрез свързване на филтрирани tags
масив и картографиран масив от входния списък с някакво търсене на данни в картата:
Като начало обобщеният израз, който филтрира масива от етикети, използва $filter
и следва:
const myTags = ["architecture", "blabladontexist"];
{
"$filter": {
"input": "$tags",
"cond": {
"$not": [
{ "$in": ["$$this.t", myTags] }
]
}
}
}
което създава филтрирания масив от документи
[
{ "t" : "contemporary", "n" : 2 },
{ "t" : "creative", "n" : 1 },
{ "t" : "concrete", "n" : 3 }
]
Сега втората част ще бъде извличането на другия масив, който ще бъде свързан към горния. Този масив изисква $map
върху myTags
входен масив като
{
"$map": {
"input": myTags,
"in": {
"$cond": {
"if": { "$in": ["$$this", "$tags.t"] },
"then": {
"t": "$$this",
"n": {
"$sum": [
{
"$arrayElemAt": [
"$tags.n",
{ "$indexOfArray": [ "$tags.t", "$$this" ] }
]
},
1
]
}
},
"else": { "t": "$$this", "n": 0 }
}
}
}
}
Горният $map
по същество преминава през входния масив и проверява с всеки елемент дали е в tags
масив, сравняващ t
свойството, ако съществува, тогава стойността на n
полето на поддокумента става текущият му n
стойност, изразена с
{
"$arrayElemAt": [
"$tags.n",
{ "$indexOfArray": [ "$tags.t", "$$this" ] }
]
}
иначе добавете документа по подразбиране с n стойност 0.
Като цяло, вашата операция по актуализиране ще бъде както следва
Последната ви операция за актуализиране става:
const myTags = ["architecture", "blabladontexist"];
db.getCollection('coll').update(
{ "_id": "1234" },
[
{ "$set": {
"tags": {
"$concatArrays": [
{ "$filter": {
"input": "$tags",
"cond": { "$not": [ { "$in": ["$$this.t", myTags] } ] }
} },
{ "$map": {
"input": myTags,
"in": {
"$cond": [
{ "$in": ["$$this", "$tags.t"] },
{ "t": "$$this", "n": {
"$sum": [
{ "$arrayElemAt": [
"$tags.n",
{ "$indexOfArray": [ "$tags.t", "$$this" ] }
] },
1
]
} },
{ "t": "$$this", "n": 0 }
]
}
} }
]
}
} }
],
{ "upsert": true }
);