ホーム>source

ユーザーをさまざまなタイムゾーンに配置できるアプリケーションを構築しています。実行するクエリはユーザーのタイムゾーンに敏感です。

私が抱えている問題は、MongoDBがクエリ時間のタイムゾーンを無視しているように見えることです!

これは日付フィールド「2019-09-29T23:52:13.495000 + 13:00」の例です。完全なjsonは次のとおりです。

そして、これはクエリの例です:

<前>ウィズウィズ

すべての日付は+12または+13のいずれかで保存されます。これは、それらが現在の顧客のタイムゾーンであるためです。基本的に、上記のクエリの意味は、2019-10-01からいくつかの結果が表示されるはずです。 00:00:00 + 13:00 10月1日はまだUTCの9月30日なので、私はそうではありません。

私はこれに慣れていないので、うさぎの穴からさほど遠くないので、リファクタリングや考え方の変更ができれば、物事が簡単になるでしょう。

コンテキストについては、PyMongoを使用していて違いがある場合、MongoDBのバージョンは4.2です。

編集! 「at」フィールドを日付に変換しようとしましたが、タイムゾーンが抑制されているか、表示されていないようです

それに伴い、クエリ方法も変更する必要がありました

<前>ウィズウィズ

助けなかった

{ "at": { "$gte": "2019-09-29T00:00:00+00:00", "$lte": "2019-09-30T00:00:00+00:00" } }
あなたの答え
  • 解決した方法 # 1

    MongoDBは日付を格納するときにUTCタイムゾーンを使用します。あなたの例の日付を使用して:

    <前>ウィズウィズ

    だから > ISODate("2019-09-29T23:52:13.495000+13:00") ISODate("2019-09-29T10:52:13.495Z")  タイムゾーンは +13:00 に変換されます  (UTC) Z によるタイムゾーン 、これはデータベースに保存されている値です。

    <前>ウィズウィズ

    「at」は ISODate() ではなくUTC時間で保存されることに注意してください。  挿入されたとおり。

    > db.test.insert({_id:0, at: ISODate("2019-09-29T23:52:13.495000+13:00")}) > db.test.find() { "_id" : 0, "at" : ISODate("2019-09-29T10:52:13.495Z") } を使用したクエリ  あなたの例に従って期待どおりに動作します:

    <前>ウィズウィズ

    使用しているビジュアルツールが原因で、タイムゾーン情報は表示されません。 +13 に表示されます   ISODate() としてのシェル 、上記の例のように。

    UTCを保存する利点は、夏時間を気にすることなく、それらを他のタイムゾーンに変換できることです。タイムゾーンを処理し、それらの間で変換する日付固有の集計演算子があります。例については、日付式演算子およびhttps://stackoverflow.com/a/48535842/5619724を参照してください。

    > db.test.find({ "at": { ... "$gte": ISODate("2019-09-29T00:00:00+00:00"), ... "$lte": ISODate("2019-09-30T00:00:00+00:00") ... } ... }) { "_id" : 0, "at" : ISODate("2019-09-29T10:52:13.495Z") }

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ java - Intellij Idea NoClassDefFoundError:com/intellij/util/messages/Topic