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

फ़ील्ड मान को विभाजित करके दस्तावेज़ों को फिर से आकार दें

MongoDB संस्करण 3.4 में इष्टतम तरीका।

mongod . का यह संस्करण $split देता है ऑपरेटर जो, निश्चित रूप से दिखाए गए अनुसार स्ट्रिंग को विभाजित करता है यहां

फिर हम का इस्तेमाल करके वैरिएबल को नया परिकलित मान असाइन करते हैं $let परिवर्तनीय ऑपरेटर। फिर नए मान का उपयोग में . में किया जा सकता है $arrayElemAt एक निर्दिष्ट सूचकांक पर तत्व वापस करने के लिए ऑपरेटर; 0 पहले तत्व और -1 . के लिए अंतिम तत्व के लिए।

ध्यान दें कि इन . में अभिव्यक्ति हमें पूर्णांक की स्ट्रिंग को वापस करने के लिए अंतिम तत्व को विभाजित करने की आवश्यकता है।

अंत में हमें कर्सर को पुनरावृति करने की आवश्यकता है ऑब्जेक्ट करें और संख्या या parseInt और बल्क ऑपरेशन और bulkWrite() $set की विधि अधिकतम दक्षता के लिए उन क्षेत्रों के लिए मूल्य।

let requests = [];
db.coll.aggregate(
    [
        { "$project": {  
            "person": { 
                "$let": { 
                    "vars": { 
                        "infos":  { "$split": [ "$person", "," ] } 
                    }, 
                    "in": { 
                        "name": { "$arrayElemAt": [ "$$infos", 0 ] }, 
                        "age": { 
                            "$arrayElemAt": [ 
                                { "$split": [ 
                                    { "$arrayElemAt": [ "$$infos", -1 ] }, 
                                    " " 
                                ]}, 
                                -1 
                            ] 
                        } 
                    } 
                } 
            }  
        }}
    ] 
).forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.person.name, 
                    "age": Number(document.person.age) 
                },
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 ops and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

 // Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB 3.2 या नया।

MongoDB 3.2 पुराने Bulk() को हटा देता है एपीआई और उससे जुड़ी तरीके और bulkWrite() . प्रदान करता है विधि लेकिन यह $split . प्रदान नहीं करती है ऑपरेटर इसलिए हमारे पास यहां एकमात्र विकल्प मैपरेडस () हमारे डेटा को बदलने के लिए विधि और फिर बल्क ऑपरेशन का उपयोग करके संग्रह को अपडेट करें।

var mapFunction = function() { 
    var person = {}, 
    infos = this.person.split(/[,\s]+/); 
    person["name"] = infos[0]; 
    person["age"] = infos[2]; 
    emit(this._id, person); 
};

var results = db.coll.mapReduce(
    mapFunction, 
    function(key, val) {}, 
    { "out": { "inline": 1 } }
)["results"];

results.forEach(document => { 
    requests.push({ 
        "updateOne": { 
            "filter": { "_id": document._id }, 
            "update": { 
                "$set": { 
                    "name": document.value.name, 
                    "age": Number(document.value.age) 
                }, 
                "$unset": { "person": " " }
            } 
        } 
    }); 
    if ( requests.length === 500 ) { 
        // Execute per 500 operations and re-init
        db.coll.bulkWrite(requests); 
        requests = []; 
    }} 
);

// Clean up queues
if(requests.length > 0) {
    db.coll.bulkWrite(requests);
}

MongoDB संस्करण 2.6 या 3.0।

हमें अब बहिष्कृत बल्क API का उपयोग करने की आवश्यकता है ।

var bulkOp = db.coll.initializeUnorderedBulkOp();
var count = 0;

results.forEach(function(document) { 
    bulkOp.find({ "_id": document._id}).updateOne(
        { 
            "$set": { 
                "name": document.value.name, 
                "age": Number(document.value.age)
            },
            "$unset": { "person": " " }
        }
    );
    count++;
    if (count === 500 ) {
        // Execute per 500 operations and re-init
        bulkOp.execute();
        bulkOp = db.coll.initializeUnorderedBulkOp();
    }
});

// clean up queues
if (count > 0 ) {
    bulkOp.execute();
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. योग मोंगोडब द्वारा समूह

  2. MongoMapper मॉडल के लिए अनसेट ऑपरेशन विफल, मॉडल से कुंजी को हटा / हटा नहीं सकता

  3. $lookup का विदेशी क्षेत्र नेस्टेड दस्तावेज़ का क्षेत्र हो सकता है?

  4. mongorestore त्रुटि:पता नहीं डंप फ़ाइल के साथ क्या करना है

  5. फ़िल्टर से मेल खाने वाले सरणी के अंतिम तत्व में मान के आधार पर दस्तावेज़ों को क्रमबद्ध करें। मोंगोडब