2013-08-07 21 views
9

MongoDB thực hiện so sánh ngày như thế nào? Tôi đã thử một vài thử nghiệm trên vỏ MongoDB:MongoDB so sánh ngày

> 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)" ] } 
] 

Bây giờ tôi sẽ cố gắng để có được tất cả các đối tượng với một ngày trong dates lớn hơn 30 tháng 8, 2000.

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

[ 

] 

Đúng như dự đoán, các tài liệu không khớp. Sử dụng "ngày 30 tháng 8 năm 1999", thay vào đó ...

> 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)" ] } 
] 

Tài liệu phù hợp! Tôi đang thiếu gì?

Trả lời

11

Dường như có liên quan đến chuyển đổi ngày.

Bạn đang sử dụng phiên bản MongoDB nào? Trong vỏ trực tuyến của MongoDB tôi nhận được như sau:

> 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)" 

Tuy nhiên, nếu tôi cố gắng trong 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") 

Trong trường hợp của bạn, Dường như MongoDB được lập chỉ mục các chuỗi phiên bản và sau đó thực hiện một so sánh chuỗi cơ bản mà sẽ giải thích kết quả bạn đang nhận được.

+0

Oh, snap! Tôi đã thử nghiệm nó trong vỏ trực tuyến ... Cảm ơn bạn! –