我在Mongo中有以下对象:
{
"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
会产生结果 .
关于为什么会出现这种行为的任何想法?
2 回答
较旧版本的MongoDB在Unix Epoch(1970年1月1日)之前的日期存在问题;跨越时期边界的查询不会返回正确的结果 .
关于这个话题有一个thread on the newsgroup .
底线:您应该使用版本> = 2.0的二进制文件并运行
这将修复您的索引 . 请记住,重新索引大型集合可能需要花费大量时间 .
JavaScript ISODate对象存储从1970年1月1日开始的时间(以毫秒为单位).JavaScript Date类的规范如下:http://bclary.com/2004/11/07/#a-15.9从本文档开始,最早的"legal"日期是1月1日,129 UTC .
d =新日期(“Mon,01 Jan 0001 00:00:00 GMT 00:00”)是无效的日期对象 . 我相信失败的是JavaScript,而不是MongoDB . 不同版本的MongoDB shell以不同方式处理无效日期:
在1.6中:
在1.8和2.0中:
在2.1中:
如果创建了“合法”日期对象,则查询将按预期工作:
所有这一切都说,正如mnemosyn指出的那样,看起来mongod中的索引日期存在问题,现在已经解决了 . 如果可能,您应升级到2.0,并在日期中存在旧索引时重新编制索引 .