MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

यदि सरणी में मौजूद है तो MongoDB दस्तावेज़ या वेतन वृद्धि फ़ील्ड सम्मिलित करें

MongoDB 4.2 और नए के साथ, अद्यतन विधि अब एक दस्तावेज़ या एक समग्र पाइपलाइन जहां निम्नलिखित चरणों का उपयोग किया जा सकता है:

  1. $addFields और इसका उपनाम $set
  2. $project और इसका उपनाम $unset
  3. $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 }
);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नेस्टेड सरणी नेवला अद्यतन कर रहा है

  2. मोंगोइंजिन के लिए ऑपरेटर ऑल और आइकॉन के उपयोग को कैसे संयोजित करें

  3. MongoDB के साथ GUID आधारित शार्ड कुंजी को प्रोग्रामेटिक रूप से पूर्व-विभाजित कैसे करें

  4. क्या आपके पास MongoDB में संग्रह स्तर की अनुमति हो सकती है?

  5. MongoRepository गतिशील प्रश्न