0

私はMongoDBを初めて使用しています。運がよければ特定のクエリを取得するのに苦労しています。 私は、日付と金額を持つ数百万の文書を持つコレクションを持っています。特定の期間の集計を取得したいと思います。 例えば、私はサンプル収集1/1/2015 - 15/1/2015間と1/2/2015 - 15/2/2015グループは離散的な日付範囲に基づいています

の間の期間のカウント、金額の総和を取得したいが、出力は次のようになり1/1/2017 - 10/10/20171/2/2017 - 10/2/2017間の日付範囲の

{ "_id" : "148404972864202083547392254", "account" : "3600", "amount" : 50, "date" : ISODate("2017-01-01T12:02:08.642Z")} 

{ "_id" : "148404972864202085437392254", "account" : "3600", "amount" : 50, "date" : ISODate("2017-01-03T12:02:08.642Z")} 

{ "_id" : "148404372864202083547392254", "account" : "3600", "amount" : 70, "date" : ISODate("2017-01-09T12:02:08.642Z")} 

{ "_id" : "148404972864202083547342254", "account" : "3600", "amount" : 150, "date" : ISODate("2017-01-22T12:02:08.642Z")} 

{ "_id" : "148404922864202083547392254", "account" : "3600", "amount" : 200, "date" : ISODate("2017-02-02T12:02:08.642Z")} 

{ "_id" : "148404972155502083547392254", "account" : "3600", "amount" : 30, "date" : ISODate("2017-02-7T12:02:08.642Z")} 

{ "_id" : "148404972864202122254732254", "account" : "3600", "amount" : 10, "date" : ISODate("2017-02-10T12:02:08.642Z")} 

次のとおりです。

  • 2017年1月1日 - 2017年10月1日 - カウント= 3、量の総和:170
  • 2017年10月2日 - 15/2/2017 - 件数= 2、合計金額:40

このような異なる日付範囲で作業することは可能ですか?コードはJavaになりますが、mongoの例として、誰かが私を助けてくれますか?

答えて

1

これよりも洗練されたソリューションが必要です。とにかくそれを関数にラップし、日付に関連する引数を一般化することができます。

最初に、アイテムがどの範囲に入るかを決定する際に同時に投影を行う必要があります(巨大な$switchの表現に注意してください)。デフォルトでは、アイテムは「null」の範囲に入ります。

次に、条件に一致しない結果(つまり、range!= null)を除外します。

最後のステップは、範囲で項目をグループ化し、必要な計算をすべて行うことです。あなたのデータに基づいて

db.items.aggregate([ 
    { $project : { 
    amount : true, 
    account : true, 
    date : true, 
    range : { 
     $switch : { 
     branches : [ 
      { 
      case : { 
       $and : [ 
       { $gte : [ "$date", ISODate("2017-01-01T00:00:00.000Z") ] }, 
       { $lt : [ "$date", ISODate("2017-01-10T00:00:00.000Z") ] } 
       ] 
      }, 
      then : { $concat : [ 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-01-01T00:00:00.000Z") } }, 
       { $literal : " - " }, 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-01-10T00:00:00.000Z") } } 
      ] } 
      }, 
      { 
      case : { 
       $and : [ 
       { $gte : [ "$date", ISODate("2017-02-01T00:00:00.000Z") ] }, 
       { $lt : [ "$date", ISODate("2017-02-10T00:00:00.000Z") ] } 
       ] 
      }, 
      then : { $concat : [ 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-02-01T00:00:00.000Z") } }, 
       { $literal : " - " }, 
       { $dateToString: { format: "%d/%m/%Y", date: ISODate("2017-02-10T00:00:00.000Z") } } 
      ] } 
      } 
     ], 
     default : null 
     } 
    } 
    } }, 
    { $match : { range : { $ne : null } } }, 
    { $group : { 
    _id : "$range", 
    count : { $sum : 1 }, 
    "amount summation" : { $sum : "$amount" } 
    } } 
]) 

それは*以下の結果が得られます:

{ "_id" : "01/02/2017 - 10/02/2017", "count" : 2, "amount summation" : 230 } 
{ "_id" : "01/01/2017 - 10/01/2017", "count" : 3, "amount summation" : 170 } 

を私はあなたの質問にいくつかの誤字を持っていると信じて*データが異なって見える理由、それはです。

関連する問題