sql >> データベース >  >> NoSQL >> MongoDB

文字列タイムスタンプを使用した平均集計

    現実的には、ここでタイムスタンプ文字列を修正する必要があります。ただし、ISO文字列に固有の「yyyy-dd-mm」形式のため、少なくとも「辞書式順序」になっています。

    したがって、それらは固定長であるため、サーバー側の集約用の集約フレームワークを使用して実際に集約できます。

    日付選択のための5月のサンプリング:

    cursor = client[page1.currentDB][page2.currentColl].aggregate([
      { "$match": {
         "Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]":
           { "$exists": True },
         "timestamp": {
           "$gte": "2017-05-01 00:00:00", "$lt": "2017-06-01 00:00:00"
         }
      }},
      { "$group": {
        "_id": {
          "$substr": [ "$timestamp", 0, 10 ]
        },
        "average":
          { "$avg": "$Technique-Meteo_Direction moyenne du vent_Mean value wind direction[]" }
      }}
    ])
    

    これにより、選択した月の各日の「1日あたり」の合計が取得されます。これは、フィールドの字句値に依存します。ここでは、同じ基本原則がすべての間隔に適用されます。したがって、選択したい間隔まで、文字列にゼロ値を入力するだけです。

    ここでの「グループ化キー」についても同じことが言えます。ここで、 _idの値は 同様に、必要な間隔までの部分文字列である必要があります。幸い、文字列形式は「ゼロパディング」であるため、 "10"未満の値になります。 "05" のように、前にゼロが付きます 。繰り返しますが、これは「範囲」の辞書式順序を維持します。

    それがあなたが目指すべきことであり、ここでフィールドを選択し、範囲選択のためのタイムスタンプ文字列を生成する必要があると思います。

    ただし、 $ group <を実行できることで、確かに何かを得ることができます。 / code> [ $ substr] [2] 実際の値の一部で、必要な間隔を示します。間隔ごとに複数のクエリ呼び出しを繰り返す必要はなく、データベースに任せるだけです。

    ただし、「キー」は別の問題であり、一貫性がないため、考えられる「キー名」を繰り返し処理し、それらすべてに対して個別の集計を実行することに固執しているように見えます。 $ ifNull いつインクリメントするかを決定します。次に、 $divide 「後」 $ group 最終的な「平均」を取得するためのパイプラインステージ。

    その最後のビットは、完全な範囲を知らなくても少し複雑であり、すべてが完全にあなたの質問にあるわけではありません。ですから、それはあなたに任せて解決するか、別の質問をします。




    1. ClusterControlを使用したロールベースのアクセス制御の実施

    2. 単一のクエリでmongodbの2つのコレクションからデータを取得します

    3. redisのluaで現在の日付と時刻を取得する

    4. Mongodbは、アクセント付きの文字を基になる文字として一致させます