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

संग्रह में गुणों को मैप करने के लिए मानचित्र/कमी का उपयोग करना

ठीक है, यह थोड़ा और जटिल है क्योंकि आपको कुछ रिकर्सन का उपयोग करने की आवश्यकता होगी।

रिकर्सन करने के लिए, आपको सर्वर पर कुछ फ़ंक्शन स्टोर करने में सक्षम होना चाहिए।

चरण 1:कुछ फ़ंक्शन को परिभाषित करें और उन्हें सर्वर-साइड रखें

isArray = function (v) {
  return v && typeof v === 'object' && typeof v.length === 'number' && !(v.propertyIsEnumerable('length'));
}

m_sub = function(base, value){
  for(var key in value) {
    emit(base + "." + key, null);
    if( isArray(value[key]) || typeof value[key] == 'object'){
      m_sub(base + "." + key, value[key]);
    }
  }
}

db.system.js.save( { _id : "isArray", value : isArray } );
db.system.js.save( { _id : "m_sub", value : m_sub } );

चरण 2:मानचित्र को परिभाषित करें और कार्यों को कम करें

map = function(){
  for(var key in this) {
    emit(key, null);
    if( isArray(this[key]) || typeof this[key] == 'object'){
      m_sub(key, this[key]);
    }
  }
}

reduce = function(key, stuff){ return null; }

चरण 3:मानचित्र को कम करें और परिणाम देखें

mr = db.runCommand({"mapreduce" : "things", "map" : map, "reduce" : reduce,"out": "things" + "_keys"});
db[mr.result].distinct("_id");

आपको जो परिणाम मिलेंगे वे हैं:

["_id", "_id.isObjectId", "_id.str", "_id.tojson", "egg", "egg.0", "foo", "foo.bar", "foo.bar.baaaar", "hello", "type", "type.0", "type.1"]

यहाँ एक स्पष्ट समस्या है, हम यहाँ कुछ अनपेक्षित फ़ील्ड जोड़ रहे हैं:1. _आईडी डेटा2. .0 (अंडे और प्रकार पर)

चरण 4:कुछ संभावित सुधार

समस्या #1 . के लिए फिक्स अपेक्षाकृत आसान है। बस map को संशोधित करें समारोह। इसे बदलें:

emit(base + "." + key, null); if( isArray...

इसके लिए:

if(key != "_id") { emit(base + "." + key, null); if( isArray... }

समस्या #2 थोडा और तीखा है। आप सभी चाहते थे कुंजी और तकनीकी रूप से "egg.0" है एक वैध कुंजी। आप m_sub modify को संशोधित कर सकते हैं ऐसी संख्यात्मक कुंजियों को अनदेखा करने के लिए। लेकिन ऐसी स्थिति को देखना भी आसान है जहां यह उलटा असर करता है। मान लें कि आपके पास नियमित सरणी के अंदर एक सहयोगी सरणी है, तो आप चाहते हैं कि "0" दिखाई दे। मैं उस समाधान का शेष भाग आप पर छोड़ता हूँ।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. मोंगोडीबी:ऑब्जेक्ट आईडी बनाम एक आईडी युक्त स्ट्रिंग का उपयोग करने का लाभ?

  2. रिमोट सर्वर से मोंगोडम्प

  3. ऐरे के बिना एंबेडेड दस्तावेज़?

  4. MongoDB बैकअप और पुनर्स्थापना

  5. मौजूदा ग्रिडफ़्स फ़ाइल में डेटा जोड़ें