9

MongoDBはどのように日付比較を実行しますか? MongoDB シェルでいくつかのテストを試みました。

> db.test.insert( { "dates" : [ new Date("Jul 21, 1983"), new Date("Aug 7, 1999") ] } )
"ok"
> db.test.find()

[ 
  {   "_id" : {   "$oid" : "5201e8b7cc93742c160bb9d8"   },   "dates" : [   "Thu Jul 21 1983 00:00:00 GMT+0200 (CEST)",   "Sat Aug 07 1999 00:00:00 GMT+0200 (CEST)" ]   }
]

datesここで、日付が2000 年 8 月 30 日より後のすべてのオブジェクトを取得しようとします。

> db.test.find( { "dates" : { $gt : new Date("Aug 30, 2000") } } )

[

]

予想どおり、ドキュメントは一致しません。代わりに「1999 年 8 月 30 日」を使用すると...

> db.test.find( { dates : { $gt : new Date("Aug 30, 1999") } } )

[ 
  {   "_id" : {   "$oid" : "5201e8b7cc93742c160bb9d8"   },   "dates" : [   "Thu Jul 21 1983 00:00:00 GMT+0200 (CEST)",   "Sat Aug 07 1999 00:00:00 GMT+0200 (CEST)" ]   }
]

書類が一致!私は何が欠けていますか?

4

1 に答える 1

12

日付変換に関係しているようです。

どのバージョンの MongoDB を使用していますか? MongoDB のオンライン シェルでは、次のようになります。

> new Date("Jul 21, 1983")
"Thu Jul 21 1983 00:00:00 GMT+0200 (CEST)"
> new Date("Aug 7, 1999")
"Sat Aug 07 1999 00:00:00 GMT+0200 (CEST)"

> new Date("Aug 30, 2000")
"Wed Aug 30 2000 00:00:00 GMT+0200 (CEST)"
> new Date("Aug 30, 1999")
"Mon Aug 30 1999 00:00:00 GMT+0200 (CEST)"

ただし、MongoDB 2.2.2 で試してみると

> new Date("Jul 21, 1983")
ISODate("1983-07-20T22:00:00Z")
> new Date("Aug 7, 1999")
ISODate("1999-08-06T22:00:00Z")
> new Date("Aug 30, 2000")
ISODate("2000-08-29T22:00:00Z")
> new Date("Aug 30, 1999")
ISODate("1999-08-29T22:00:00Z")

あなたの場合、MongoDB は文字列バージョンにインデックスを付けてから、得られる結果を説明する基本的な文字列比較を実行しているようです。

于 2013-08-07T07:08:40.413 に答える