web-dev-qa-db-ja.com

MongoDBの条件によるグループ化

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

次のような結果セットを取得する必要があります。

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

つまり、1日あたりの平均不良率を取得する必要があります。これは可能ですか?

13
okoboko

集約フレームワークはあなたが望むものです:

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

したがって、最初に 日付集計演算子 を使用してその日にグループ化し、指定された日のアイテムのtotalCountを取得します。ここで $cond 演算子を使用すると、「ステータス」が実際に欠陥であるかどうかが決まり、結果は条件付きです $sum ここでは、「欠陥」値のみがカウントされます。

それらが1日ごとにグループ化されると、単純に $divide 結果になり、 $cond ゼロで除算していないことを確認します。

20
Neil Lunn