、結果はあなたのように代わりにハッシュキーを有するので、あなたがあなたを表す値を持つ_id
キーでオブジェクトの配列を取得し、出力を「希望」とは若干異なるものになりますフィールドごとにグループ化します。例えば、代わりの
{
"28-10-2016":{
"success_count": 10,
"failure_count": 10
},
"29-10-2016": {
"success_count": 10,
"failure_count": 10
}
}
あなたは$sum
アキュムレータオペレータに$cond
演算子を使用して必要となる上記の結果を達成
[
{
"_id": "28-10-2016",
"success_count": 10,
"failure_count": 10
},
"_id": "29-10-2016",
"success_count": 10,
"failure_count": 10
}
]
のような優れた構造を持っていると思います。 $cond
オペレータは、最初の引数(if)に基づいて論理条件を評価し、次に評価が真(then)である2番目の引数または3番目の引数(false)を返します。一つは_id
に$dateToString
演算子を使用して集計演算を実行する必要があり、結果として得られるパイプラインとして
"success_count": {
"$sum": {
"$cond": [ { "$eq": [ "$status", "success" ] }, 1, 0 ]
}
}
:これは、それぞれ$sum
に供給1と0の数値に真/偽の論理を変換します$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);
})
を次のようにここに投稿してください –
@ClementAmarnathはコメントでコードを投稿するOPを奨励しないでください、それが読みにくいです。代わりに、[編集]リンクを使用して質問を追加情報で更新してください。 – chridam
@chridam私は彼に、コメントではなく、問題のコードを投稿して欲しかった、私のコメントで彼に正しく伝えられないかもしれない:-) –