0

コレクション構造グループ収集データ

Order = new Schema 
    index:   { type: Number, unique: true } 
    number:   Date 
    status:   { type: String, enum: ['success', 'failure'] } 
    created_at:  { type: Date, default: Date.now } 
    updated_at:  { type: Date, default: Date.now } 

をMongoDBの私は、成功回数と失敗を日付でグループ化されたカウントとして私にデータを持つオブジェクトの配列を返すクエリを支援する必要があります。集約フレームワークで EX-

orders = { 
       28-10-2016:{ 
       success_count: 10, 
       failure_count: 10 
       }, 
       29-10-2016: { 
       success_count: 10, 
       failure_count: 10 
       } 
      } 
+0

を次のようにここに投稿してください –

+0

@ClementAmarnathはコメントでコードを投稿するOPを奨励しないでください、それが読みにくいです。代わりに、[編集]リンクを使用して質問を追加情報で更新してください。 – chridam

+0

@chridam私は彼に、コメントではなく、問題のコードを投稿して欲しかった、私のコメントで彼に正しく伝えられないかもしれない:-) –

答えて

4

、結果はあなたのように代わりにハッシュキーを有するので、あなたがあなたを表す値を持つ_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); 
}) 
+0

これはまさに私が望んでいたものです。ありがとう@chridam! –

関連する問題