2016-06-22 3 views
0

私は、トランザクションごとに1ドキュメント - 販売取引を表すMongoのドキュメントをたくさん持っています。各文書内では、取引の価値と日付は&です。私は毎日のすべてのトランザクションの合計値を合計するクエリを実行したいと思います。mongodb - 時間をかけて値を合計したい

私は集約フレームワークを見てきましたが、フィルタリングを行うためにタイムスタンプ/日付を使用する例は見つかりませんでした。誰も私にこれを行う方法のいくつかのポインターを与えることができますか?

+0

サンプルJSONドキュメントを表示できますか? –

答えて

1

集約フレームワークは正しい方向です。集約を使用する前に

は、のは、いくつかのデータを準備してみましょう:

var data = [ 
    { 
     value: 10, 
     dateTime: ISODate("2016-06-01T06:00:00.000Z") 
    },{ 
     value: 20, 
     dateTime: ISODate("2016-06-01T08:00:00.000Z") 
    },{ 
     value: 30, 
     dateTime: ISODate("2016-06-02T06:00:00.000Z") 
    },{ 
     value: 40, 
     dateTime: ISODate("2016-06-02T08:00:00.000Z") 
    },{ 
     value: 50, 
     dateTime: ISODate("2016-06-03T06:00:00.000Z") 
    },{ 
     value: 60, 
     dateTime: ISODate("2016-06-03T08:00:00.000Z") 
    }, 
]; 

db.saleTransaction.insert(data); 

私たちは、今、日ごとに2つのレコードを6本の販売取引記録を持っています。 '値'フィールドは数字で、 'dateTime'フィールドは日付です。あなたは2016年6月1日〜2016年6月2日分のデータが必要な場合は、クエリは、このようなものですので、

日付フィールドは、$ GT/$ LT/...オペレータによって比較することができます。

{ dateTime: 
     { $gte: ISODate("2016-06-01T00:00:00.000Z"), 
      $lt: ISODate("2016-06-03T00:00:00.000Z")}} 
} 

その後、あなたは〜2016年6月2日2016年6月1日にそれぞれの日で合計値を知りたい場合は、あなたが使用することができます例えば 、まとめる前にそれらをフィルタリングする$試合演算子を使用することができますこのクエリ:

db.saleTransaction.aggregate(
[ 
    { $match: { dateTime: 
     { $gte: ISODate("2016-06-01T00:00:00.000Z"), $lt: ISODate("2016-06-03T00:00:00.000Z")}} 
    }, 
    {$group: { _id : { 
      year:{$year:"$dateTime"}, 
      month:{$month:"$dateTime"}, 
      day:{$dayOfMonth:"$dateTime"} 
     }, 
     count:{$sum: "$value" } 
    } 
} 
]); 

結果は次のようになります。

{ "_id" : { "year" : 2016, "month" : 6, "day" : 2 }, "count" : 70 } 
{ "_id" : { "year" : 2016, "month" : 6, "day" : 1 }, "count" : 30 } 
関連する問題