Tôi tìm thấy lệnh !! nó không phải là find()
:-)
db.lang_meta.distinct("resources.schema.fields.name")
(sửa)
Xin chào, câu trả lời "hoàn toàn đúng" là một danh sách (nơi có thể lặp lại các lần lặp lại) không phải là bộ (nơi không xảy ra lặp lại). Xem trường hợp của db.lang_meta.distinct("resources.mediatype")
, trong đó giải pháp đúng phải trả về danh sách bốn mục lặp lại, không chỉ một.
Đối với danh sách chúng ta có thể sử dụng map()
... Chà, giả sử chỉ có một món đồ, nó sẽ là ...
db.lang_meta.find().map(function(c) {
return c.resources[0].schema.fields[0].name;
});
nhưng phải lặp qua .resources
và hơn .fields
, vì vậy
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;
});
... đó là gần nhưng không phải là giải pháp lý tưởng (thanh lịch).
Quay lại resources.mediatype
ví dụ, đó là một minh họa tốt hơn cho "lặp đi lặp lại",
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;
});
Điều đó tạo ra "text/csv", "text/csv", "text/csv", "text/csv"
(!) nhưng trong cấu trúc mảng của mảng ... không phải là một mảng đơn giản.
Giải pháp?
Hãy làm điều gì đó với db.lang_meta.find({},{"resources.schema.fields.name":1})
...