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

MongoDB:एक ही दस्तावेज़ में एक सरणी को किसी अन्य सरणी में कॉपी करना

अपेक्षाकृत छोटे डेटा के लिए, आप snapshot कर्सर के forEach() के साथ विधि और प्रत्येक दस्तावेज़ को निम्नानुसार अद्यतन करना:

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 
    db.wholesalers.updateOne(
        { "_id": doc._id },
        { "$set": { "brandsNetherlands": doc.brands } }
    );
});

जबकि यह छोटे संग्रहों के लिए इष्टतम है, बड़े संग्रह के साथ प्रदर्शन बहुत कम हो जाता है क्योंकि बड़े डेटासेट के माध्यम से लूपिंग और सर्वर को प्रति अनुरोध प्रत्येक अपडेट ऑपरेशन भेजने पर कम्प्यूटेशनल जुर्माना लगता है।

Bulk() एपीआई बचाव के लिए आता है और प्रदर्शन में काफी सुधार करता है क्योंकि लिखने के संचालन केवल एक बार थोक में सर्वर पर भेजे जाते हैं। दक्षता हासिल की जाती है क्योंकि विधि सर्वर को प्रत्येक लिखित अनुरोध नहीं भेजती है (जैसा कि forEach() लूप) लेकिन हर 1000 अनुरोधों में सिर्फ एक बार, इस प्रकार अपडेट को वर्तमान की तुलना में अधिक कुशल और तेज बनाता है।

उपरोक्त समान अवधारणा का उपयोग forEach() बैच बनाने के लिए लूप, हम निम्नानुसार थोक में संग्रह को अपडेट कर सकते हैं।

इस प्रदर्शन में Bulk() एपीआई MongoDB संस्करणों में उपलब्ध है >= 2.6 and < 3.2 initializeUnorderedBulkOp() समानांतर में निष्पादित करने की विधि, साथ ही एक गैर-निर्धारिती क्रम में, बैचों में लेखन कार्य:

वर बल्क =db.wholesalers.initializeUnorderedBulkOp (), काउंटर =0; // बैच अद्यतन आकार का ट्रैक रखने के लिए काउंटर

db.wholesalers.find({ 
    "brands": { "$exists": true, "$type": 4 } 
}).snapshot().forEach(function(doc){ 

    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "brandsNetherlands": doc.brands } 
    });

    counter++; // increment counter
    if (counter % 1000 == 0) {
        bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk = db.wholesalers.initializeUnorderedBulkOp();
    }
});

अगला उदाहरण नए MongoDB संस्करण पर लागू होता है 3.2 जिसने तब से Bulk() को हटा दिया है एपीआई और bulkWrite()

यह ऊपर के समान कर्सर का उपयोग करता है लेकिन उसी forEach() प्रत्येक बल्क राइट दस्तावेज़ को सरणी में धकेलने के लिए कर्सर विधि। क्योंकि राइट कमांड 1000 से अधिक ऑपरेशनों को स्वीकार नहीं कर सकता है, अधिकतम 1000 ऑपरेशन करने के लिए समूह संचालन की आवश्यकता होती है और जब लूप 1000 पुनरावृत्ति को हिट करता है तो सरणी को फिर से शुरू करता है:

var cursor = db.wholesalers.find({
         "brands": { "$exists": true, "$type": 4 } 
    }),
    bulkUpdateOps = [];

cursor.snapshot().forEach(function(doc){ 
    bulkUpdateOps.push({ 
        "updateOne": {
            "filter": { "_id": doc._id },
            "update": { "$set": { "brandsNetherlands": doc.brands } }
         }
    });

    if (bulkUpdateOps.length === 1000) {
        db.wholesalers.bulkWrite(bulkUpdateOps);
        bulkUpdateOps = [];
    }
});         

if (bulkUpdateOps.length > 0) { db.wholesalers.bulkWrite(bulkUpdateOps); }



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगो में गुम तिथियों सहित GroupBy एकत्रीकरण

  2. मैनुअल संदर्भ समर्थन

  3. MongoDB में क्वेरी परिणामों में एक फ़ील्ड का नाम बदलें

  4. mongodb में इस उपयोगकर्ता संग्रह में इस विशिष्ट डेटा को कैसे अपडेट करें?

  5. मोंगोडब:एक सरणी में नेस्टेड एक जेसन-ऑब्जेक्ट को क्वेरी करें