2013-06-19 14 views
8

dokumenty są przechowywane w następujących dziedzinach:Jak policzyć wartości logicznych w MongoDB z ram agregacji

_id: 
NumberofChildren: Integer 
OwnsAHome: Boolean 
Income: Integer 

muszę używać ramy agregacji, aby posortować według liczby dzieci więc wyjście jest coś takiego:

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 

Jak zrobić to w MongoDB z agregacją, zwłaszcza w odniesieniu do liczenia, ile razy Boolean OwnsAHome jest true?

Dzięki!

Odpowiedz

15

Faza $project jest Twoim przyjacielem w przygotowaniu, umożliwiając tworzenie nowych pól, które mają różne typy i wartości niż oryginalne pola.

Rozważmy ten występ, który używa $cond użyć jedną wartość, gdy coś jest prawdą, a drugi, gdy jest fałszywa:

{$ projekt: {numWhoOwnHome: {$ dyr: [ "$ OwnsAHome", 1, 0] }}}

Jeśli teraz wykonasz $group z {$sum : "$numWhoOwnHome"}, twój wynik będzie liczbą osób, które ustawiły OwnsAHome na prawdziwe.

+3

nie zapomnij dodać do $ projektu dla każdego pola, które chcesz aby dołączyć "fieldName: 1", w przeciwnym razie jedyną rzeczą, która wyjdzie z projektu $, będzie pole _id i to nowe pole obliczeniowe. –

+4

'{'$ group': {.... {count: {$ sum: {$ cond: [" $ closed ", 1, 0]}} ...}' $ cond działa w grupie $ od wersji 3.2 – eri

0

Postępowałem zgodnie z sugestią @eri, używając $cond.

Biorąc pod uwagę dane:

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

z:

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

dostanę wyjście:

campaign | countClick | countRemoved 
c1  | 2   | 1 
c2  | 0   | 0 
Powiązane problemy