0

データベース ソリューションに MongoDB を試してみたいので、いじっています。Aggregation Frameworkは完璧で、ドキュメントのほとんどは、私が何をしなければならないかをよく説明しています。

私のデータは次のようになります。

{ "_id" :       ObjectId("54e5e79032d4796d1dec195e"), 
  "timestamp" : ISODate("2015-01-20T10:31:02.082Z"), 
  "value" :     4089 }

たとえば、1 秒あたりのデータを集計したい場合は、次のようにします。

db.mycollection.aggregate(
 {
   $match : {
      timestamp: {$gte: ISODate("2015-01-21T12:00:00Z"), 
                  $lte: ISODate("2015-01-21T12:01:00Z")}   
   }
 },
 {
   $group : {
    _id : { $second: "$timestamp" },
    averageQuantity: { $avg: "$value" },
    count: { $sum: 1 }
  }
 }
);

私の質問は、$second や $minute などの事前定義されていない サンプル レートでデータを集計するにはどうすればよいですか? 30 秒としましょう。

私の例のコードを使用して、2 つの結果を返したいと思います。

前もって感謝します!

4

1 に答える 1

1

$second や $minute など、事前に定義されていないサンプル レートでデータを集計するにはどうすればよいですか?

集計パイプラインでの多くの計算。timestampたとえば、1 日分の時間を 30 秒間隔でグループ化する場合は、 を取得して、それが表す 1 日の秒数を計算し、それを丸めた 30 秒間隔の # に変換する必要があります。その日とグループ。

db.mycollection.aggregate([
    { "$project" : {
        "secs" : { 
            "$add" : [
                { "$multiply" : [{ "$hour" : "$timestamp"}, 60, 60] },
                { "$multiply" : [{ "$minute" : "$timestamp"}, 60] }
                { "$second" : "$timestamp"}
            ]
        }
        "value" : 1
    } },
    { "$group" : {
        "_id" : {
            "$divide" : [
                { "$subtract" : [
                    "$secs", 
                    { "$mod" : ["$secs", 30] }
                ] },
                30
            ]
        },
        "value" : { "$sum" : "$value" }
    } }
])
于 2015-02-20T18:59:09.907 に答える