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日あたりの平均不良率を取得する必要があります。これは可能ですか?
集約フレームワークはあなたが望むものです:
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
ゼロで除算していないことを確認します。