je trouve la commande !! ce n'est pas find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(modifier)
Ops, la réponse "strictement correcte" est une liste (où la répétition d'éléments est possible) pas un ensemble (où aucune répétition ne se produit). Voir le cas de db.lang_meta.distinct("resources.mediatype")
, où la solution correcte doit renvoyer une liste de quatre éléments répétés, pas un seul.
Pour liste nous pouvons utiliser map()
... Eh bien, supposons qu'un seul élément, ce serait ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
mais doit itérer sur .resources
et sur .fields
, donc
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;
});
... c'est proche mais pas la solution idéale (élégante).
Retour au resources.mediatype
exemple, c'est une meilleure illustration des "items répétés",
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;
});
Cela produit "text/csv", "text/csv", "text/csv", "text/csv"
(!) mais dans une structure tableau de tableaux... pas un simple tableau.
Solution ?
Faisons quelque chose avec db.lang_meta.find({},{"resources.schema.fields.name":1})
...