2011-11-28 63 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+,并且如果在日期上有旧索引,则重新索引。