Saya menemukan perintah!! itu bukan find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(sunting)
Ops, jawaban "benar sekali" adalah daftar (di mana pengulangan dimungkinkan) bukan set (dimana tidak terjadi pengulangan). Lihat kasus db.lang_meta.distinct("resources.mediatype")
, di mana solusi yang benar harus mengembalikan daftar empat item berulang, bukan hanya satu.
Untuk daftar kita bisa menggunakan map()
... Nah, misalkan hanya satu item, itu adalah ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
tetapi harus mengulangi .resources
dan di atas .fields
, jadi
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;
});
... yang mendekati tetapi bukan solusi ideal (elegan).
Kembali ke resources.mediatype
contoh, itu adalah ilustrasi yang lebih baik untuk "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;
});
Itu menghasilkan "text/csv", "text/csv", "text/csv", "text/csv"
(!)tetapi dalam struktur array-of-array... bukan array sederhana.
Solusi?
Mari lakukan sesuatu dengan db.lang_meta.find({},{"resources.schema.fields.name":1})
...