2014-06-11 13 views
7

Mam szereg dokumentów (sprawdź wydarzenia) w MongoDB to wyglądać tak:Group By Stan w MongoDB

{ 
    "_id" : ObjectId("5397a78ab87523acb46f56"), 
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b1"), 
    "status" : 'defect', 
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z") 
} 

{ 
    "_id" : ObjectId("5397a78ab87523acb46f57"), 
    "inspector_id" : ObjectId("5397997a02b8751dc5a5e8b2"), 
    "status" : 'ok', 
    "utc_timestamp" : ISODate("2014-06-11T00:49:14.109Z") 
} 

Muszę dostać zestaw wyników, który wygląda tak:

[ 
    { 
    "date" : "2014-06-11", 
    "defect_rate" : '.92' 
    }, 
    { 
    "date" : "2014-06-11", 
    "defect_rate" : '.84' 
    }, 
] 

Innymi słowy, potrzebuję uzyskać średnią liczbę defektów dziennie. czy to możliwe?

Odpowiedz

12

Ramy agregacji jest to, co chcesz:

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "year": { "$year": "$utc_timestamp" }, 
      "month": { "$month": "$utc_timestamp" }, 
      "day": { "$dayOfMonth": "$utc_timestamp" }, 
     }, 
     "defects": { 
      "$sum": { "$cond": [ 
       { "$eq": [ "$status", "defect" ] }, 
       1, 
       0 
      ]} 
     }, 
     "totalCount": { "$sum": 1 } 
    }}, 
    { "$project": { 
     "defect_rate": { 
      "$cond": [ 
       { "$eq": [ "$defects", 0 ] }, 
       0, 
       { "$divide": [ "$defects", "$totalCount" ] } 
      ] 
     } 
    }} 
]) 

Więc najpierw grupa dniu pomocą date aggregation operators i uzyskać TOTALCOUNT pozycji w danym dniu. Zastosowanie tutaj operatora $cond określa, czy "status" jest faktycznie defektem, czy nie, a wynik jest warunkowy $sum, gdzie liczone są tylko wartości "defektu".

Po zgrupowaniu na dzień po prostu uzyskasz $divide wynik, kolejny test z $cond, aby upewnić się, że nie dzielisz przez zero.

+0

Dzięki za wiadomość! Ma sens, ale nie działa w konsoli MongoDB. Nie ma komunikatu o błędzie, próbuję przejrzeć i sprawdzić, czy jest to składnia ... – okoboko

+0

Czy tylko kopiujesz i wklejasz? "kolekcja" musi być nazwą twojej kolekcji. Jest to tylko podstawowa nazwa, której używam, chyba że faktycznie podasz zapytanie, które wypróbowałeś w swoim pytaniu. –

+0

Tak, zmieniłem to w moim zapytaniu. – okoboko