1. ホーム

[解決済み】mongodbでISODateを使った日付クエリが動作しないようです。

2022-04-06 16:18:57

質問

MongoDBで最も基本的な日付クエリさえ動作させることができないようです。 以下のようなドキュメントがあります。

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

そして、次のようなクエリです。

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

私は 0件 を実行したところ

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

なぜうまくいかないのか、何か思い当たることはありますか?

参考までに、このクエリを生成しているのは SpringのMongoTemplate そのため、最終的にMongoDBに送信されるクエリを直接コントロールすることはできません。

(追記)

> db.version()
2.4.7

ありがとうございました。

解決方法は?

しかし $date の一部です。 MongoDB拡張JSON で、これはデフォルトで得られるものです。 mongoexport クエリの一部として使用することはできません。

で完全一致検索すると $date のようになります。

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

を実行すると、エラーが発生します。

error: { "$err" : "invalid operator: $date", "code" : 10068 }

これを試してみてください。

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

または(以下のコメントで ユーザー3805045 ):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODate は、時刻を伴わない日付の比較にも必要な場合があります (以下のように記述します。 マットモルナー ).

によると mongo シェルのデータ型 はどちらも等価であるべきです。

mongo シェルには、日付を返すためのさまざまなメソッドが用意されています。

  • Date() メソッドは、現在の日付を文字列として返します。
  • ISODate() ラッパーを使用して Date オブジェクトを返す新しい Date() コンストラクタです。
  • ISODate() ラッパーを使用して Date オブジェクトを返す ISODate() コンストラクタです。

を使用し ISODate は、やはりDateオブジェクトを返します。 .

{"$date": "ISO-8601 string"} は、厳密なJSON表現が必要な場合に使用することができます。例えば、Hadoopのコネクターなどです。