2013-09-02 30 views
8

Hãy nói rằng tôi có một bộ sưu tập được gọi là 'người' với các tài liệu sau:Làm thế nào để nối các mảng từ nhiều tài liệu trong MongoDB?

{ 
    "name": "doug", 
    "colors": ["blue", "red"] 
} 

{ 
    "name": "jack", 
    "colors": ["blue", "purple"] 
} 

{ 
    "name": "jenny", 
    "colors": ["pink"] 
} 

Làm thế nào tôi sẽ nhận được một mảng nối của tất cả các colors subarrays, ví dụ?

["blue", "red", "blue", "purple", "pink"] 

Trả lời

15

Cố gắng sử dụng tổng hợp:

db.people.aggregate([ 
    {$unwind:"$colors"}, 
    {$group:{_id:null, clrs: {$push : "$colors"} }}, 
    {$project:{_id:0, colors: "$clrs"}} 
]) 

Kết quả:

{ 
"result" : [ 
    { 
     "colors" : [ 
      "blue", 
      "red", 
      "blue", 
      "purple", 
      "pink" 
     ] 
    } 
], 
"ok" : 1 
} 

Cập nhật

Nếu bạn muốn nhận được giá trị duy nhất trong mảng kết quả, bạn có thể sử dụng $addToSet toán tử thay vì $push trong giai đoạn $group.

+0

HI nhưng nếu tôi cần giá trị duy nhất trong kết quả như thế nào tôi sẽ đạt được điều đó vì điều này sẽ cung cấp cho mục trùng lặp trong mảng này – viren

+2

Để chắc chắn. Để làm điều này, bạn có thể thay đổi toán tử '$ push' bằng' $ addToSet' trong '{$ group: {_ id: null, clrs: {$ push:" $ colors "}}},' string. –

17

Vâng, hãy thử sẽ hoạt động tốt cho bạn !!

db.people.distinct("colors") 
+1

đơn giản và hiệu quả! câu trả lời này phải là câu trả lời được chấp nhận. – Mithril

+0

rất tốt, chính xác những gì tôi cần; nó cũng là tốt để biết rằng bạn có thể vượt qua một truy vấn tùy chọn để 'khác biệt' để lọc ra các kết quả. [source] (https://docs.mongodb.com/manual/reference/method/db.collection.distinct/#specify-query-with-distinct) – zaboco

+0

Cảm ơn người đàn ông, chính xác là tôi cần :) –

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