MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Phép chiếu danh sách MongoDB của trường con

Tôi tìm thấy lệnh !! nó không phải là find() :-)

db.lang_meta.distinct("resources.schema.fields.name")

db.collection.distinct

(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}) ...




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. giảm giá trị trong bộ sưu tập cho đến 0

  2. Phương pháp tiếp cận được khuyến nghị đối với cơ sở dữ liệu nhiều người thuê trong MongoDB là gì?

  3. Ngăn chặn hoảng loạn thời gian chạy trong bson.ObjectIdHex

  4. Meteor - Lỗi MongoDB:Không thể áp dụng công cụ sửa đổi $ addToSet cho không phải mảng

  5. Đã vượt quá hạn ngạch đĩa trên OpenShift