MongoDB 4.2 और नए के साथ, अद्यतन विधि अब एक दस्तावेज़ या एक समग्र पाइपलाइन जहां निम्नलिखित चरणों का उपयोग किया जा सकता है:
$addFields
और इसका उपनाम$set
$project
और इसका उपनाम$unset
$replaceRoot
और इसका उपनाम$replaceWith
।
उपरोक्त के साथ, समग्र पाइपलाइन के साथ आपका अपडेट ऑपरेशन टैग
. को ओवरराइड करने के लिए होगा फ़िल्टर किए गए टैग
. को संयोजित करके फ़ील्ड मानचित्र में कुछ डेटा लुकअप के साथ इनपुट सूची की सरणी और मैप की गई सरणी:
सबसे पहले, टैग ऐरे को फ़िल्टर करने वाला एग्रीगेट एक्सप्रेशन $फ़िल्टर
और यह इस प्रकार है:
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
अनिवार्य रूप से इनपुट सरणी पर लूप करता है और प्रत्येक तत्व के साथ जांचता है कि क्या यह टैग
. में है t
. की तुलना में सरणी संपत्ति, यदि यह मौजूद है तो n
. का मान उप-दस्तावेज़ का क्षेत्र उसका वर्तमान n
बन जाता है के साथ Valueexpressed
{
"$arrayElemAt": [
"$tags.n",
{ "$indexOfArray": [ "$tags.t", "$$this" ] }
]
}
अन्यथा 0 के n मान के साथ डिफ़ॉल्ट दस्तावेज़ जोड़ें।
कुल मिलाकर, आपका अपडेट ऑपरेशन इस प्रकार होगा
आपका अंतिम अपडेट ऑपरेशन बन जाता है:
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 }
);