首页 文章

MongoDB在最短日期之前找不到记录

提问于
浏览
3

我在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 回答

  • 0

    较旧版本的MongoDB在Unix Epoch(1970年1月1日)之前的日期存在问题;跨越时期边界的查询不会返回正确的结果 .

    关于这个话题有一个thread on the newsgroup .

    底线:您应该使用版本> = 2.0的二进制文件并运行

    db.yourCollection.reIndex()
    

    这将修复您的索引 . 请记住,重新索引大型集合可能需要花费大量时间 .

  • 3

    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中:

    > 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,并在日期中存在旧索引时重新编制索引 .

相关问题