Намирам командата!! не е find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(редактиране)
Опс, „строго правилният“ отговор е списък (където е възможно повторение на itens) не е набор (където не се случва повторение). Вижте случая на 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
например, това е по-добра илюстрация на "повтарящите се елементи",
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})
...