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

MongoDB सबफील्ड की सूची प्रक्षेपण

मुझे आदेश मिल गया !! यह find() नहीं है :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct

(संपादित करें)

ऑप्स, "सख्ती से सही" उत्तर एक सूची है (जहां दोहराना संभव है) सेट . नहीं (जहां कोई दोहराव नहीं होता है)। db.lang_meta.distinct("resources.mediatype") का मामला देखें , जहां सही समाधान को केवल एक ही नहीं, बल्कि चार बार-बार दोहराई जाने वाली वस्तुओं की सूची लौटानी होगी।

सूची के लिए हम map() . का उपयोग कर सकते हैं ... ठीक है, मान लीजिए कि केवल एक आइटम है, वह होगा ...

db.lang_meta.find().map(function(c) { 
  return c.resources[0].schema.fields[0].name; 
});

लेकिन .resources . पर पुनरावृति होनी चाहिए और अधिक .fields , तो

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
        for (var j=0; j<c.resources[i].schema.fields.length; j++) 
             ret.push( c.resources[i].schema.fields[j].name );
   return ret;
});

... वह निकट है लेकिन आदर्श (सुरुचिपूर्ण) समाधान नहीं है।

resources.mediatype पर वापस लौट रहे हैं उदाहरण के लिए, यह "repeat itens" के लिए एक बेहतर उदाहरण है,

db.lang_meta.find().map(function(c) {
    var ret = [];
    for (var i=0; i<c.resources.length; i++) 
             ret.push( c.resources[i].mediatype );
   return ret;
});

यह "text/csv", "text/csv", "text/csv", "text/csv" उत्पन्न करता है (!) लेकिन एक सरणी-सरणी संरचना में... एक साधारण सरणी नहीं।

समाधान?

चलिए db.lang_meta.find({},{"resources.schema.fields.name":1}) के साथ कुछ करते हैं ...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:उप-दस्तावेज़ फ़ील्ड मानों की विशिष्ट सूची कैसे प्राप्त करें?

  2. क्या मोंगो ऑब्जेक्ट आईडी को एक स्ट्रिंग में बदलना और यूआरएल के लिए इसका इस्तेमाल करना ठीक है?

  3. मोंगोडब में किसी फ़ील्ड का केवल मान कैसे लौटाएं?

  4. ClusterControl द्वारा समर्थित सर्वाधिक लोकप्रिय NoSQL डेटाबेस

  5. PDO ड्राइवर का उपयोग करके MongoDB से कनेक्ट करना