集計フレームワークを使用すると、ハッシュキーを使用する代わりに、 _id
を使用してオブジェクトの配列を取得するため、結果は「目的の」出力とは少し異なります。 フィールドごとにグループ化することを表す値を持つキー。たとえば、
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
あなたは
のようなより良い構造を持っているでしょう[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
上記の結果を得るには、 <を使用する必要があります。 code> $ cond
$sum<の演算子/ code>
アキュムレータ演算子。 $ cond
>
演算子は、最初の引数(if)に基づいて論理条件を評価し、評価がtrueの場合は2番目の引数(then)、falseの場合は3番目の引数(else)を返します。これにより、真/偽のロジックが1と0の数値に変換され、 $ sum
それぞれ:
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
結果のパイプラインとして、 $ dateToString
_id
の演算子 のキー式$ group
パイプライン:
Orders.aggregate([
{
"$group": {
"_id": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
},
"failure_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "failure" ] }, 1, 0 ]
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})
ただし、上記よりもはるかに高速に実行される、より柔軟でパフォーマンスの高いアプローチがあります。ここでは、集計結果の最も効率的なデータ構造は、たとえば次のスキーマに従います。
orders = [
{
"_id": "28-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
},
{
"_id": "29-10-2016",
"counts": [
{ "status": "success", "count": 10 },
{ "status": "failure", "count": 10 }
]
}
]
次に、次のように代替パイプラインを実行することを検討してください
Orders.aggregate([
{
"$group": {
"_id": {
"date": {
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$created_at"
}
},
"status": { "$toLower": "$status" }
},
"count": { "$sum": 1 }
}
},
{
"$group": {
"_id": "$_id.date",
"counts": {
"$push": {
"status": "$_id.status",
"count": "$count"
}
}
}
}
], function (err, orders){
if (err) throw err;
console.log(orders);
})