2016-05-19 7 views
6

私は1日に5秒ごとにデータポイントを含むデータセットを持っています。これにより、データセットはになります。 このセットは大きすぎるので、私はそれを小さくしたい(私はこれらのアイテムを使ってグラフを描いている)。Symfony/Doctrine/MongoDBすべてのN番目のアイテムを取得する

グラフのx軸は時間が経過しているので、データポイントごとに5分のギャップがあると判断しました。これは1日にデータポイントに戻ります。グラフを作るには十分に少なく、十分です。

私はMongoCollectionは、次のようになります。

{ 
    "timestamp":"12323455", 
    "someKey":123, 
    "someOtherKey": 345, 
    "someOtherOtherKey": 6789 
} 

データをデータベースに5秒ごとに掲載されます。タイムスタンプは結果ごとに5秒ずつ異なります。

私のX軸は5分のシーケンスで分けられているので、これらの5分間に平均値someKey,someOtherKeyおよびsomeOtherOtherkeyを計算したいと思います。 この新しい平均値はグラフのデータポイントの1つになります。

1つのデータポイントをすべて平均して5分間隔で取得するにはどうすればよいですか? (1日に288データポイント)。

$result = $collection 
    ->createQueryBuilder() 
    ->field('timestamp')->gte($todayMidnight) 
    ->sort('timestamp', 'DSC') 
    ->getQuery() 
    ->execute(); 

どのようにして、5分ごとのためのデータポイント(および取得するために(同じクエリ内)データのこのリストをフィルタリングします:今、私はこの日深夜からすべての文書を選択していますについては

データポイントはこれらの5分以内のポイントの平均です)?

のdoctrineで構築されたこのクエリをsymfonyアプリケーションで使用するとよいでしょう。

EDIT 私はmongoshellの作業の中で最初にクエリを取得しようとしました。 提案のコメントと同様に、私はaggregationを使い始めるべきです。

私はこれまでstackoverflow

で、ここで尋ねた別の質問に基づいています。これは、現在のクエリで行ったクエリ:

db.Pizza.aggregate([ 
    { 
     $match: 
     { 
      timestamp: {$gte: 1464559200} 
     } 
    }, 
    { 
     $group: 
     { 
      _id: 
      { 
       $subtract: [ 
        "$timestamp", 
        {"$mod": ["$timestamp", 300]} 
       ] 
      }, 
      "timestamp":{"$first":"$timestamp"}, 
      "someKey":{"$first":"$someKey"}, 
      "someOtherKey":{"$first":"$someOtherKey"}, 
      "someOtherOtherKey":{"$first":"$someOtherOtherKey"} 
     } 
    } 
]) 

このクエリは私に各300秒間、最後の結果が得られます(5分)今日の真夜中から。クエリがを返す必要があります

{ 
    "timestamp":"1464559215", 
    "someKey":123, 
    "someOtherKey": 345, 
    "someOtherOtherKey": 6789 
}, 
{ 
    "timestamp":"1464559220", 
    "someKey":54, 
    "someOtherKey": 20, 
    "someOtherOtherKey": 511 
}, 
{ 
    "timestamp":"1464559225", 
    "someKey":654, 
    "someOtherKey": 10, 
    "someOtherOtherKey": 80 
}, 
{ 
    "timestamp":"1464559505", 
    "someKey":90, 
    "someOtherKey": 51, 
    "someOtherOtherKey": 1 
} 

: 私たちは、この例のデータセットを取るもしそうなら、それはそれらの300秒以内にすべての文書を取得し、列someKeysomeOtherKey上の平均値を計算するためにsomeOtherOtherKey

をしたいですすなわち、行:最初の結果は次のように計算される

{ 
    "timestamp":"1464559225", 
    "someKey":277, 
    "someOtherKey": 125, 
    "someOtherOtherKey": 2460 
}, 
{ 
    "timestamp":"1464559505", 
    "someKey":90, 
    "someOtherKey": 51, 
    "someOtherOtherKey": 1 
} 

Result 1 - someKey = (123+54+654)/3 = 277 
Result 1 - someOtherKey = (345+20+10)/3 = 125 
Result 1 - someOtherOtherKey = (6789+511+80)/3 = 2460 

集計関数を使用してmongoshell内でこの計算を行う方法を教えてください。ここで私は私が望んでいた正確に何を得ることができたのstackoverflow上の所定answeresに基づいて

+0

これは集約フレームワークの仕事のように聞こえますが、使用しようとしましたか? – malarzm

+0

どのようにして集約フレームワークを使用しますか?私はグループを使用しようとしましたが、私は固執しました:/ – Baklap4

+1

私はそれ自身に堪能ではありません。おそらくドキュメントやその他の問題がいくつか出てくるでしょう:) Doctrineで集約を使用することについては、砂糖はまだ(水分補給のための未完成のPRがありますが)それを使用することは可能です。 – malarzm

答えて

2

これは私が戻ってすべての私の結果を得るために行う必要があり、大きな集約クエリです:

db.Pizza.aggregate([ 
    { 
     $match: 
     { 
      timestamp: {$gte: 1464559200} 
     } 
    }, 
    { 
     $group: 
     { 
      _id: 
      { 
       $subtract: [ 
        '$timestamp', 
        {$mod: ['$timestamp', 300]} 
       ] 
      }, 
      timestamp: {$last: '$timestamp'}, 
      someKey: {$avg: '$someKey'}, 
      someOtherKey: {$avg: '$someOtherKey'}, 
      someOtherOtherKey: {$avg: '$someOtherOtherKey'} 
     } 
    }, 
    { 
     $project: 
     { 
      _id: 0, 
      timestamp: '$timestamp', 
      someKey: '$someKey', 
      someOtherKey:'$someOtherKey', 
      someOtherOtherKey:'$someOtherOtherKey' 
     } 
    } 
]) 

マッチ部分は今日ミッドナイト(今日の深夜のタイムスタンプ)の後に、すべての結果を取得するためです。

グループの一部では最も興味深い部分です。ここでは、見つかったすべてのドキュメントをループして、300秒ごとにモジュラスを計算し(5分)、プロパティタイムスタンプにモジュラス演算の最終結果を入力します。

プロジェクトの部分は、結果はもう、データベース内の何かを表していないとして、実際の結果から_idを除去する必要があります。

このanswereが基づいている

考えるansweres:

MongoDB - Aggregate max/min/average for multiple variables at once

How to subtract in mongodb php

MongoDB : Aggregation framework : Get last dated document per grouping ID

教義ソリューション

$collection->aggregate([ 
    [ 
     '$match' => [ 
      'timestamp' => ['$gte' => 1464559200] 
     ] 
    ], 
    [ 
     '$group' => [ 
      '_id' => [ 
       '$subtract' => [ 
        '$timestamp', 
        [ 
         '$mod' => ['$timestamp',300] 
        ] 
       ] 
      ], 
      'timestamp' => [ 
       '$last' => '$timestamp' 
      ], 
      $someKey => [ 
       '$avg' => '$'.$someKey 
      ], 
      $someOtherKey => [ 
       '$avg' => '$'.$someOtherKey 
      ], 
      $someOtherOtherKey => [ 
       '$avg' => '$'.$someOtherOtherKey 
      ] 
     ] 
    ] 
]); 
関連する問題