MongoDB在最近的日期没有找到记录

时间:2011-11-28 17:55:45

标签: mongodb

我在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会产生结果。

有关为何展示此行为的任何想法?

2 个答案:

答案 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+,并在日期有旧索引时重新索引。