2013-04-22 23 views
22

Hãy nói rằng tôi có tài liệu sau đây trong bộ sưu tập:MongoDB: Làm thế nào để có được danh sách riêng biệt của các giá trị trường tài liệu phụ?

{ 
    "family": "Smith", 
    "children": [ 
     { 
      "child_name": "John" 
     }, 
     { 
      "child_name": "Anna" 
     }, 
    ] 
} 

{ 
    "family": "Williams", 
    "children": [ 
     { 
      "child_name": "Anna" 
     }, 
     { 
      "child_name": "Kevin" 
     }, 
    ] 
} 

Bây giờ tôi muốn để có được bằng cách nào đó trong danh sách sau đây của tên con độc đáo vượt qua tất cả các gia đình:

[ "John", "Anna", "Kevin" ] 

Cấu trúc của kết quả có thể khác nhau. Làm thế nào để đạt được điều đó trong MongoDB? Nên có một cái gì đó đơn giản nhưng tôi không thể tìm ra. Tôi đã thử hàm aggregate() trên bộ sưu tập nhưng sau đó tôi không biết cách áp dụng hàm distinct().

+0

http://docs.mongodb.org/manual/core/map-reduce/ –

Trả lời

46

Bạn chỉ có thể làm:

db.collection.distinct("children.child_name"); 

Trong trường hợp của bạn nó trả về:

[ "John", "Anna", "Kevin" ] 
+2

Chết tiệt, thật dễ dàng! Tôi bẻ đầu. Cảm ơn đây là câu trả lời làm việc ngắn nhất, cho tôi chính xác những gì tôi muốn. – vladimir

+2

ok - nhưng những gì về hiệu suất trên cụm sharding? khác biệt sẽ được xử lý trên mỗi ví dụ rs chẳng hạn;) –

+1

Rõ ràng là tôi không nghĩ đến hiệu suất đó. Nhưng đây là điều quan trọng, cảm ơn. – vladimir

5

với khuôn khổ giúp đỡ tập:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}]) 

hoặc nhiều sự quan tâm;) với tần số và tên:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}]) 
+0

nhưng đó không phải là những gì anh ấy yêu cầu - anh ấy muốn mảng tên riêng biệt không phải là bản phụ với mỗi tên và số ... –

+0

tôi đã đọc nó : > "Cấu trúc kết quả có thể khác." và có !, đây là một cấu trúc khác;) –

+0

Có, cảm ơn. Nó hoạt động và buộc tôi phải tìm hiểu thêm về khung công cụ tổng hợp() – vladimir

Các vấn đề liên quan