Ik vind de opdracht!! het is niet find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(bewerken)
Oeps, het "strikt juiste" antwoord is een lijst (waar herhaling mogelijk is) geen set (waar geen herhaling optreedt). Zie het geval van db.lang_meta.distinct("resources.mediatype")
, waarbij de juiste oplossing een lijst van vier herhaalde items moet retourneren, niet slechts één.
Voor lijst we kunnen map()
. gebruiken ... Nou, stel dat er maar één item is, dan is het ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
maar moet herhalen over .resources
en over .fields
, dus
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;
});
... dat is dichtbij, maar niet de ideale (elegante) oplossing.
Terugkerend naar het resources.mediatype
dat is bijvoorbeeld een betere illustratie van de "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;
});
Dat levert "text/csv", "text/csv", "text/csv", "text/csv"
op (!)maar in een array-of-array-structuur... geen simpele array.
Oplossing?
Laten we iets doen met db.lang_meta.find({},{"resources.schema.fields.name":1})
...