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

MongoDB:रेगेक्स का उपयोग करके किसी फ़ील्ड का नाम कैसे बदलें

यह मैपरेडस ऑपरेशन नहीं है, तब तक नहीं जब तक आप एक नया संग्रह नहीं चाहते हैं जिसमें केवल _id हो और मान फ़ील्ड जो मानचित्र से उत्पन्न होते हैं, आउटपुट को कम करें, जैसे:

    "_id": ObjectId("53f2b954b55e91756c81d3a5"), 
    "value": { 
        "domain": "example.com",
        ... 
    } 
}

जो आपके संग्रह का एक प्रकार का "सर्वर साइड" पुनर्विक्रय है, लेकिन निश्चित रूप से उस संरचना में नहीं जो आप चाहते हैं।

जबकि सर्वर में सभी कोड को निष्पादित करने के तरीके हैं, कृपया ऐसा करने का प्रयास न करें जब तक कि आप वास्तव में किसी स्थान पर न हों। ये तरीके आम तौर पर वैसे भी शार्डिंग के साथ अच्छा नहीं खेलते हैं, जो आमतौर पर रिकॉर्ड के विशाल आकार के लिए "वास्तव में एक जगह पर" होते हैं।

जब आप चीजों को बदलना चाहते हैं और इसे थोक में करना चाहते हैं, तो आपको आम तौर पर संग्रह परिणामों को "लूप" करना पड़ता है और वर्तमान दस्तावेज़ जानकारी तक पहुंच के दौरान अद्यतनों को संसाधित करना होता है। यानी, उस स्थिति में जहां आपका "अपडेट" दस्तावेज़ के फ़ील्ड या संरचना में पहले से मौजूद जानकारी पर "आधारित" है।

इसलिए "रेगेक्स रिप्लेस" ऑपरेशन उपलब्ध नहीं है, और निश्चित रूप से किसी फ़ील्ड का नाम बदलने के लिए कोई नहीं है। तो चलिए बल्क ऑपरेशंस के साथ लूप करते हैं सर्वर पर कोड चलाए बिना ऐसा करने के "सबसे सुरक्षित" रूप के लिए।

var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;

db.collection.find().forEach(function(doc) {

    for ( var k in doc ) {
        if ( doc[k].match(/^2014.*/) ) {
            var update = {};
            update["$unset"][k] = 1;
            update["$set"][ k.replace(/(\d+)-(\d+)-(\d+).+/,"$1$2$3") ] = doc[k];
            bulk.find({ "_id": doc._id }).updateOne(update);
            counter++;
        }
    }

    if ( counter % 1000 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }

});

if ( counter % 1000 != 0 )
    bulk.execute();

तो मुख्य चीजें हैं $unset मौजूदा फ़ील्ड को हटाने के लिए ऑपरेटर और $set दस्तावेज़ में नया फ़ील्ड बनाने के लिए ऑपरेटर। आपको "फ़ील्ड नाम" और "मान" दोनों की जांच और उपयोग करने के लिए दस्तावेज़ सामग्री की आवश्यकता है, इसलिए लूपिंग के रूप में कोई अन्य तरीका नहीं है।

यदि आपके पास सर्वर पर MongoDB 2.6 या अधिक नहीं है तो लूपिंग अवधारणा अभी भी तत्काल प्रदर्शन लाभ के बिना बनी हुई है। आप .eval() सर्वर पर संसाधित करने के लिए, लेकिन जैसा कि दस्तावेज़ीकरण से पता चलता है, यह वास्तव में अनुशंसित नहीं है। यदि आवश्यक हो तो सावधानी के साथ प्रयोग करें।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. k8s/पायथन:मैं कुबेरनेट्स पायथन क्लाइंट का उपयोग करके एक रहस्य कैसे पढ़ूं?

  2. geoNear द्वारा उप दस्तावेज़ प्राप्त करता है - MongoDB

  3. Java MongoDB एक साथ कई दस्तावेज़ सहेजता है

  4. मोंगोडीबी:मैं संग्रह में सरणी वस्तु को स्टोर करना चाहता हूं

  5. किसी फ़ाइल से अधिकतम मान खोजने के लिए MongoTemplate विधि या क्वेरी