我在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()}}
同样地,在$lt
字段上使用end
不会产生任何结果,但$gt
会产生结果。
有关为何展示此行为的任何想法?
答案 0 :(得分:3)
早期版本的MongoDB在Unix Epoch(1970年1月1日)之前的日期出现问题;跨越时代边界的查询不会返回正确的结果。
有关此主题的thread on the newsgroup。
结论:你应该使用版本为> = 2.0的二进制文件并运行
db.yourCollection.reIndex()
这将修复您的索引。请记住,重新索引大型集合可能需要花费大量时间。
答案 1 :(得分:0)
JavaScript ISODate对象存储从1970年1月1日开始的时间(以毫秒为单位).JavaScript Date类的规范如下:http://bclary.com/2004/11/07/#a-15.9从本文档中,最早的“合法”日期是1月1日,129 UTC。
d =新日期(“星期一,01年1月1日00:00:00 GMT +00:00”)是无效的日期对象。我相信失败的是JavaScript,而不是MongoDB。不同版本的MongoDB shell以不同方式处理无效日期:
在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+,并在日期有旧索引时重新索引。