Dengan MongoDB 4.2 dan yang lebih baru, metode pembaruan sekarang dapat mengambil dokumen atau pipa agregat di mana tahapan berikut dapat digunakan:
$addFieldsdan aliasnya$set$projectdan aliasnya$unset$replaceRootdan aliasnya$replaceWith.
Berbekal hal di atas, operasi pembaruan Anda dengan pipa agregat akan menimpa tags bidang dengan menggabungkan tags yang difilter array dan array yang dipetakan dari daftar input dengan beberapa pencarian data di peta:
Untuk memulainya, ekspresi agregat yang memfilter larik tag menggunakan $filter
dan berikut ini:
const myTags = ["architecture", "blabladontexist"];
{
"$filter": {
"input": "$tags",
"cond": {
"$not": [
{ "$in": ["$$this.t", myTags] }
]
}
}
}
yang menghasilkan larik dokumen yang difilter
[
{ "t" : "contemporary", "n" : 2 },
{ "t" : "creative", "n" : 1 },
{ "t" : "concrete", "n" : 3 }
]
Sekarang bagian kedua adalah untuk menurunkan array lain yang akan digabungkan dengan yang di atas. Array ini memerlukan $map
di atas myTags masukan larik sebagai
{
"$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 di atas
dasarnya mengulang array input dan memeriksa dengan setiap elemen apakah itu ada di tags array membandingkan t properti, jika ada maka nilai n bidang subdokumen menjadi n saat ini nilai yang diekspresikan dengan
{
"$arrayElemAt": [
"$tags.n",
{ "$indexOfArray": [ "$tags.t", "$$this" ] }
]
}
lain tambahkan dokumen default dengan nilai n 0.
Secara keseluruhan, operasi pembaruan Anda adalah sebagai berikut
Operasi pembaruan terakhir Anda menjadi:
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 }
);