मुझे आदेश मिल गया !! यह find()
नहीं है :-)
db.lang_meta.distinct("resources.schema.fields.name")
(संपादित करें)
ऑप्स, "सख्ती से सही" उत्तर एक सूची है (जहां दोहराना संभव है) सेट . नहीं (जहां कोई दोहराव नहीं होता है)। 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})
के साथ कुछ करते हैं ...