2011-11-28 46 views
3

發現記錄我在蒙戈下列對象:的MongoDB不分鐘日期

{ 
    "end" : new Date("Fri, 31 Dec 9999 23:59:59 GMT +00:00"), 
    "start" : new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00"),..... 
} 

我想返回基於今天的日期記錄:

{"start" : {"$lt" : new Date()}, "end": {"$gt" : new Date()}} 

這將返回什麼。

我已經試過只使用起始日期:

{"start" : {"$lt" : new Date()}} 

這將返回什麼。但是,這並不工作:

{"start" : {"$gt" : new Date()}} 

同樣,使用上end場產量$lt沒有結果,但$gt一樣。

爲什麼會出現此行爲的任何想法?

+0

什麼版本的mongodb? –

+0

MongoDB中的最小/最大日期範圍是多少?是否有限制? – SomethingOn

+0

它的1.7.6版本(我認爲) –

回答

3

舊版本的MongoDB在Unix Epoch(1970年1月1日)之前有日期問題;跨曆元邊界的查詢不會返回正確的結果。

有關於此主題的thread on the newsgroup

底線:你應該使用二進制的版本> = 2.0和運行

db.yourCollection.reIndex() 

這將解決您的索引。請記住,重新索引巨大的收藏可能需要很長時間。

+0

聽起來像這個問題 - 將試一試並回復你。 –

0

JavaScript ISODate對象存儲1970年1月1日以毫秒爲單位的時間。JavaScript Date類的規範如下:http://bclary.com/2004/11/07/#a-15.9從此文檔中,最早的「合法」日期是UTC,01年1月1日。

d = new Date(「Mon,01 Jan 01 00:00:00 GMT +00:00」)是一個無效的日期對象。我相信失敗的是JavaScript,而不是MongoDB。不同版本的MongoDB的外殼處理無效的日期有所不同:

在1.6:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00") 
"Invalid Date" 

在1.8和2.0:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00") 
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ") 

在2.1:

> d = new Date("Mon, 01 Jan 0001 00:00:00 GMT +00:00") 
ISODate("2001-01-01T00:00:00Z") 

如果「合法「日期對象創建後,您的查詢將按預期工作:

> db.time.save({ "end" : new Date("Fri, 31 Dec 9999 23:59:59 GMT +00:00"), "start" : new Date("Mon, 01 Jan 1970 00:00:00 GMT +00:00")}) 
> db.time.find({"start" : {"$lt" : new Date()}, "end": {"$gt" : new Date()}}) 
{ "_id" : ObjectId("4ed3fa4f89b8abdabefe1b5c"), "end" : ISODate("9999-12-31T23:59:59Z"), "start" : ISODate("1970-01-01T00:00:00Z") } 

所有這些被說,正如mnemosyn指出的那樣,看起來好像mongod中的索引日期問題現在已經解決了。如果可能的話,你應該升級到2.0+,並且如果在日期上有舊索引,則重新索引。