2013-07-30 24 views
6

Tôi có một bộ sưu tập mà trông giống như sau:Sử dụng khuôn khổ MongoDB gộp vào nhóm theo độ dài của mảng

{ 
    "_id": "id0", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
     { ... }, 
     { ... }, 
    ] 
} 
{ 
    "_id": "id1", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
    ] 
} 
{ 
    "_id": "id2", 
    "name": "...", 
    "saved_things": [ 
     { ... }, 
    ] 
} 

vv ...

Tôi muốn sử dụng khuôn khổ hợp MongoDB của để đưa ra với kết quả biểu đồ cho biết số lượng người dùng có số lượng nhất định là saved_things. Ví dụ: đối với tập dữ liệu ở trên, nó có thể trả về một cái gì đó như:

{ "_id": 1, "count": 2 }, 
{ "_id": 3, "count": 1 } 

Tôi đã thử các kết hợp khác nhau của hàm tổng hợp như dưới đây, nhưng không có cách nào hiệu quả. (Tôi có cảm giác rằng tôi đang nói về điều này một cách khủng khiếp sai.)

collection.aggregate([ 
    { $unwind: "$saved_things" }, 
    { $group: "$_id", count: { $sum: 1 } } }, 
    { $group: "$count", number: { $sum: 1 } } }, 
    { $sort: { number: -1 } } 
], function(err, result) { 
    console.log(result); 
}); 

Điều này có thể xảy ra với khung làm việc của Mongo hay không?

+0

Ý của bạn là gì với _how nhiều người dùng có một số lượng nhất định của saved_things subcollectin_? Với 'saved_thing', bạn muốn biết người dùng nào có' saved_things' và bao nhiêu? Có phải đó không? –

+0

Hmm từ ngữ của tôi có vẻ khó hiểu, xin lỗi về điều đó! Tôi nghĩ rằng ví dụ đầu ra mô tả tốt nhất những gì tôi đang tìm kiếm, nhưng tôi sẽ cố gắng mô tả nó một lần nữa. Tôi muốn nhận số lượng đối tượng trong 'saved_things' cho mỗi người dùng trong bộ sưu tập và tổng hợp tần suất của số đó. Nó tạo ra một biểu đồ về số lượng 'save_things' của người dùng (nếu điều đó có ý nghĩa). Hãy cho tôi biết nếu điều đó vẫn còn khó hiểu theo bất kỳ cách nào. –

Trả lời

5

Ok, đã hiểu! Đây rồi. Đường ống dẫn dầu kết hợp là cơ bản mà:

{ 
    $unwind: "$saved_things" 
}, 
{ 
    $group: { 
     _id: "$_id", 
     size: { 
      $sum: 1 
     } 
    } 
}, 
{ 
    $group: { 
     _id: "$size", 
     frequency: { 
      $sum: 1 
     } 
    } 
}, 
{ 
    $project: { 
     size: "$_id", 
     frequency: 1, 
     _id: 0 
    } 
} 

Thư giãn saved_things mảng, sau đó nhóm bằng văn _id và đếm nó, do đó chúng tôi có thể đạt được kích thước mảng. Bây giờ là dễ dàng, nhóm theo size và đếm tần số. Sử dụng dự án để đổi tên trường _id thành size.

+0

Có vẻ như nó rất gần. Tôi nhận được điều này là đầu ra: https://gist.github.com/stevenleeg/2b1a2ee9c5400f5f3089 –

+0

Chỉ đùa thôi! Tôi đã lặp lại 'kết quả' thay vì' kết quả' gây ra vấn đề. Điều duy nhất tôi thấy rằng không phải là khá làm việc là không có dữ liệu cho tần số 0. Có bất cứ điều gì có thể được thực hiện về điều đó? –

+0

tôi không tin rằng tập hợp này sẽ bao gồm giá trị tần số cho các tài liệu có mảng có độ dài bằng không. Đã gãi đầu của tôi trong một phút là tại sao tổng số tần số của tôi không khớp với số lượng bộ sưu tập cụ thể của tôi. – steveinatorx

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