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

MongoDbで15分の時間間隔で結果をグループ化します

    これを行うにはいくつかの方法があります。

    1つは、日付集計演算子を使用する方法です。これにより、ドキュメント内の「日付」値を分析できます。特に主な目的としての「グループ化」の場合:

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "year": { "$year": "$created_at" },
          "dayOfYear": { "$dayOfYear": "$created_at" },
          "hour": { "$hour": "$created_at" },
          "interval": {
            "$subtract": [ 
              { "$minute": "$created_at" },
              { "$mod": [{ "$minute": "$created_at"}, 15] }
            ]
          }
        }},
        "count": { "$sum": 1 }
      }}
    ])
    

    2番目の方法は、日付オブジェクトが別の日付オブジェクトから減算される(または他の直接数学演算)ときのちょっとしたトリックを使用することです。結果は、2つのオブジェクト間のエポックタイムスタンプミリ秒を表す数値になります。したがって、エポック日付を使用するだけで、エポックミリ秒表現が得られます。次に、間隔に日付計算を使用します:

    db.collection.aggregate([
        { "$group": {
            "_id": {
                "$subtract": [
                    { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                    { "$mod": [ 
                        { "$subtract": [ "$created_at", new Date("1970-01-01") ] },
                        1000 * 60 * 15
                    ]}
                ]
            },
            "count": { "$sum": 1 }
        }}
    ])
    

    したがって、グループ化間隔に必要な出力形式の種類によって異なります。どちらも基本的に同じものを表しており、コード内の「日付」オブジェクトとして再構築するのに十分なデータがあります。

    _idをグループ化した後、「グループ化演算子」の部分に他に必要なものを入れることができます 。私は、あなたが本当にやりたいことについてのあなた自身からの実際の声明の代わりに、基本的な「カウント」の例を使用しています。

    MongoDB4.x以降

    最初の記述以降、日付集約演算子にいくつかの追加がありましたが、MongoDB 4.0からは、BSON日付変換でここで行われる基本的な数学のトリックとは対照的に、実際の「型の実際のキャスト」が行われます。

    たとえば、$toLongを使用できます および$toDate ここで新しいヘルパーとして:

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "$toDate": {
            "$subtract": [
              { "$toLong": "$created_at" },
              { "$mod": [ { "$toLong": "$created_at" }, 1000 * 60 * 15 ] }
            ]
          }
        },
        "count": { "$sum": 1 }
      }}
    ])
    

    これは少し短く、パイプラインを定義する際の定数として「エポック」値の外部BSON日付を定義する必要がないため、すべての言語実装でかなり一貫性があります。

    これらは、型変換の「ヘルパー」メソッドの2つにすぎず、すべて$convertに関連付けられています。 メソッド。これは実装の「より長い」形式であり、nullでのカスタム処理を可能にします。 または変換エラー。

    このようなキャストを使用して、Dateを取得することも可能です。 ObjectIdからの情報 これは「作成」日付の信頼できるソースになるため、主キーの:

    db.collection.aggregate([
      { "$group": {
        "_id": {
          "$toDate": {
            "$subtract": [
              { "$toLong": { "$toDate": "$_id" }  },
              { "$mod": [ { "$toLong": { "$toDate": "$_id" } }, 1000 * 60 * 15 ] }
            ]
          }
        },
        "count": { "$sum": 1 }
      }}
    ])
    

    したがって、この種の変換を使用した「キャストタイプ」は、非常に強力なツールになる可能性があります。

    警告 -ObjectId 値はの精度に制限されます $toDateを許可するデータの一部を構成する内部時間値のみ 変換。実際に挿入される「時間」は、おそらく使用中のドライバーによって異なります。 精度 必須ですが、ObjectIdに依存するのではなく、個別のBSONDateフィールドを使用することをお勧めします。 値。



    1. Dockerコンテナ間でRedisデータを存続させます-Dockerコンテナでダウンとアップを作成します

    2. Redisキャッシュを使用して大きなオブジェクトをキャッシュする方法

    3. Redis/プレフィックス付きのredisからすべてのキーと値を取得

    4. MongoDB Java Inserting Throws org.bson.codecs.configuration.CodecConfigurationException:クラスio.github.ilkgunel.mongodb.Pojoのコーデックが見つかりません