Dengan MongoDB 4.2 dan yang lebih baru, metode pembaruan sekarang dapat mengambil dokumen atau pipa agregat di mana tahapan berikut dapat digunakan:
$addFields
dan aliasnya$set
$project
dan aliasnya$unset
$replaceRoot
dan 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 }
);