2016-12-02 13 views
0

以下のデータがあります。カテゴリと月ごとに結果をグループ化し、合計を返します。mongodbグループ月の一部

第1の望ましい出力は、カテゴリー別に12ヶ月間集計された月名のネストされた配列です。データに存在しない月は返されますが、合計は0です。

{"category":"Auto","month":{"Jan":9.12,"Feb":9.12,"Mar":0,...}}, 
{"category":"Fees","month":{..."Apr":0,"May":4.56,"Jun":0,...}}, 
{"category":"Travel","month":{..."Oct":0,"Nov":4.56,"Dec":0}} 

第2の所望の出力は、数ヶ月...

これらの結果はMongoDBので問い合わせることができますどのように
{"category":"Auto","Jan":4.56,"Feb":4.56,"Mar":0,...}, 
{"category":"Fees",..."Apr":0,"May":4.56,"Jun":0,...}, 
{"category":"Travel",..."Oct":0,"Nov":0,"Dec":4.56,} 

を入れ子にしているしない配列ですか?ここではサンプルの入力データは次のとおりです。

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f1"), 
    "transid" : 1, 
    "category": "Auto", 
    "postdate" : ISODate("2016-01-28T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f2"), 
    "transid" : 5, 
    "category": "Auto", 
    "postdate" : ISODate("2016-01-31T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f3"), 
    "transid" : 3, 
    "category": "Auto", 
    "postdate" : ISODate("2016-02-28T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f4"), 
    "transid" : 2, 
    "category": "Auto", 
    "postdate" : ISODate("2016-02-31T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f5"), 
    "transid" : 6, 
    "category": "Fees", 
    "postdate" : ISODate("2016-05-16T05:00:00.000Z"), 
    "total" : 4.56 } 

{ 
    "_id" : ObjectId("583f6e6d14c8042dd7c153f6"), 
    "transid" : 7, 
    "category": "Travel", 
    "postdate" : ISODate("2016-11-13T05:00:00.000Z"), 
    "total" : 4.56 } 

私はMongoDBのとSQL背景から来て新たなんだので、私は、SQL用語で、このすべてのことを考えてきた感じ。

以下は、mongodbのドキュメントを読み、「sql think」を翻訳しようとしているところです。私は基本的に指定された年(この場合は2016年)にフィルタリングしようとしています。私はカテゴリと日付でグループ分けしています。最後のステップでは、プロジェクトと$ condキーワードを使用して、月ごとの開始日と終了日を指定して月に「サブ集計」し、月名をJan、Febなどに割り当てることを計画しています...構文エラーがありますこれが正しいか最善のアプローチかどうかはわかりません。

db.transactions.aggregate(
    [ 
    { $match: { "postdate": {$gte: new Date("2016-01-01")}} }, 
    { $group: { _id: {"category":"$category","postdate":"$postdate"} , "total": { $sum: "$debit" } } }, 
    { $project: {"_id":0,"category":"$_id.category", 
     "month":{$cond: { 
          $and: 
           [ 
            { $gte: ["$_id.postdate", new Date("2016-01-01")] }, 
            { $lt: ["$_id.postdate", new Date("2016-02-01")] }, 
           ] 
          },"Jan":"$sum"} 
       //repeat for all other 11 months... 
    }} 
    ] 
) 
+0

私は最初のシナリオで私が望む出力に近づける解決策を見出しましたが、私は数ヶ月を表示することができないので、微調整が必​​要です。私はそれを持って遊ぶつもりですが、それは正しい軌道上に誰かを置くかもしれません。私はこの解決策をここに別のポストで見つけました:[リンク] http://stackoverflow.com/questions/25843255/mongodb-aggregate-count-on-multiple-fields-simultaneously –

+0

これまで私が持っていたことは次のとおりです: 'db.transactions {"$ group":{ "_id":{ {$ match:{"postdate":{$ gte:new Date( "2016-01-01")}}} { "カテゴリ"" $ category "、 "月 ":{" $ month ":" $ postdate "} }、 "合計 ":{" $ sum ":" $ total "} }}、 {" $ {"_id": "$ _id.category"、 "月": ]) ' –

答えて

0

月単位でグループ化する場合は、月演算子を使用できます。例:

私はあなたに何をしているのですか?

関連する問題