コマンドを見つけました!! find()
ではありません :-)
db.lang_meta.distinct("resources.schema.fields.name")
(編集)
Ops、「厳密に正しい」答えはリスト (繰り返し反復が可能な場合)セットではありません (繰り返しが発生しない場合)。 db.lang_meta.distinct("resources.mediatype")
のケースを参照してください 、正しいソリューションでは、1つだけでなく、4つの繰り返しアイテムのリストを返す必要があります。
リストの場合 map()
を使用できます ...ええと、1つのアイテムだけを想定すると、それは...
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
に戻る たとえば、これは「繰り返しの繰り返し」のより良い例です。
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})
で何かをしましょう ...