2013-06-19 35 views
8

Tài liệu được lưu trữ với các lĩnh vực sau:Làm thế nào để đếm Booleans trong MongoDB với khuôn khổ hợp

_id: 
NumberofChildren: Integer 
OwnsAHome: Boolean 
Income: Integer 

tôi cần phải sử dụng khuôn khổ hợp để sắp xếp theo số lượng trẻ em nên đầu ra là một cái gì đó như thế này:

Number of Children: 3 
Number of People: some value, say 17 
Number of People who own a home: some value less than 17 which is a sum of the number of true Booleans 
Average income: some value 

làm thế nào tôi có thể làm điều này trong MongoDB với tập hợp, đặc biệt là liên quan đến đếm số lần Boolean OwnsAHome, được true?

Cảm ơn!

Trả lời

15

Giai đoạn $project là bạn của bạn trong đường ống bằng cách cho phép bạn tạo các trường mới có loại và giá trị khác với trường gốc.

xem xét dự báo này trong đó sử dụng $cond sử dụng một giá trị khi có điều gì là đúng và một số khác khi nó sai:

{$ dự án: {numWhoOwnHome: {$ cond: [ "$ OwnsAHome", 1, 0] }}}

Nếu bây giờ bạn thực hiện $group với {$sum : "$numWhoOwnHome"} kết quả của bạn sẽ là số người có OwnsAHome được đặt thành true.

+3

đừng quên để thêm vào $ dự án cho mọi lĩnh vực bạn muốn để bao gồm "fieldName: 1" nếu không thì điều duy nhất để thoát khỏi dự án $ sẽ là trường _id và trường được tính toán mới này. –

+4

'{'$ group': {.... {count: {$ sum: {$ cond: [" $ closed ", 1, 0]}} ...}' $ cond hoạt động trong $ group kể từ phiên bản 3.2 – eri

0

Tôi đã làm theo đề xuất @eri sử dụng $cond.

Với dữ liệu:

campaign | flags.click | flags.removed 
c1  | true  | false 
c1  | true  | true 
c2  | false  | false 

với:

Contact.aggregate(
    [ 
     { 
      $group: { 
       _id: "$campaign", 
       countClick: { 
        $sum: { $cond: ["$flags.click", 1, 0] } 
       }, 
       countRemoved: { 
        $sum: { $cond: ["$flags.removed", 1, 0] } 
       }, 
      } 
     } 
    ] 
).exec(); 

tôi sẽ nhận được kết quả:

campaign | countClick | countRemoved 
c1  | 2   | 1 
c2  | 0   | 0 
Các vấn đề liên quan