2014-06-11 9 views
7

Ich habe eine Reihe von Dokumenten (Check Ereignisse) in MongoDB, die wie folgt aussehen:Group By Zustand in 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") 
} 

Ich brauche eine Ergebnismenge zu erhalten, die wie folgt aussieht:

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

Mit anderen Worten, ich muss die durchschnittliche Fehlerrate pro Tag erhalten. Ist das möglich?

Antwort

12

Der Aggregations Rahmen ist, was Sie wollen:

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" ] } 
      ] 
     } 
    }} 
]) 

Sie also erste Gruppe am Tag der date aggregation operators verwenden und die totalcount der Objekte auf dem angegebenen Tag. Die Verwendung des Operators $cond bestimmt hier, ob der "Status" tatsächlich ein Defekt ist oder nicht, und das Ergebnis ist eine bedingte $sum, bei der nur die "defect" -Werte gezählt werden.

Sobald diese gruppiert pro Tag sind Sie einfach $divide das Ergebnis, mit einer anderen Überprüfung mit $cond, um sicherzustellen, dass Sie nicht durch Null dividieren.

+0

Danke für die Veröffentlichung! Sinnvoll, aber es läuft nicht in der MongoDB-Konsole. Keine Fehlermeldung, ich versuche durchzuwaten und zu sehen, ob es eine Syntax-Sache ist ... – okoboko

+0

Kopieren und einfügen? "Sammlung" muss der Name Ihrer Sammlung sein. Es ist nur ein einfacher Name, den ich verwende, es sei denn, Sie geben tatsächlich eine Abfrage an, die Sie in Ihrer Frage ausprobiert haben. –

+0

Ja, ich habe das in meiner Abfrage geändert. – okoboko