mongodb中的日期字段不一致,为什么会发生,如何识别和修复

mongodb中的日期字段不一致,为什么会发生,如何识别和修复,mongodb,Mongodb,我最近在我的mongod 4.0中发现了具有以下内容的日期字段: "last_update" : ISODate("-229-05-06T07:23:23Z") "last_update" : ISODate("50170-12-13T06:03:34Z") "last_update" : ISODate("0000-07-23T05:19:55Z") 因此,我的问题是

我最近在我的mongod 4.0中发现了具有以下内容的日期字段:

 "last_update" : ISODate("-229-05-06T07:23:23Z")
 "last_update" : ISODate("50170-12-13T06:03:34Z")
 "last_update" : ISODate("0000-07-23T05:19:55Z")
因此,我的问题是:

  • mongodb是否允许日期字段(日期类型的有符号64位整数)具有这种自由度
  • 据此:

    看起来格式还可以吗

    Datetime[1970年之前或9999年之后]{“$date”:{“$numberLong”:}

    尝试按预期从mongo shell ISO日期帮助器中插入时,我不允许:

     MongoDB Enterprise mongos> db.test.insert({  "created" : ISODate("-229-05-06T07:23:23Z")  })
     2021-01-29T11:47:53.484+0100 E QUERY    [js] Error: invalid ISO date: -229-05-06T07:23:23Z :
     ISODate@src/mongo/shell/types.js:65:1
     @(shell):1:31
     MongoDB Enterprise mongos>
    
    但同时,在另一个集合中插入原始文档中受影响的字段没有问题:

     MongoDB Enterprise mongos> var x = db.theAffectedCollection.findOne({_id:ObjectId("5c6e8c6ce0ebbb309ce0dc06")}, 
    {created:1,last_update:1})
     MongoDB Enterprise mongos> use test
     MongoDB Enterprise mongos> db.test.insert(x)
     WriteResult({ "nInserted" : 1 })
     MongoDB Enterprise mongos> db.test.find()
    { "_id" : ObjectId("5c6e8c6ce0ebbb309ce0dc06"), "created" : ISODate("-229-05-06T07:23:23Z"), "last_update" : ISODate("-229-05-06T07:23:23Z") }
    
    mongoexport结果:

     "created":{"$date":"-0229-05-06T07:23:23.000Z"}
    
    幸运的是,文档id时间戳显示了确切的创建日期:

     ObjectId("5c6e8c6ce0ebbb309ce0dc06").getTimestamp()
     ISODate("2019-02-21T11:33:00Z")
    

    问题已澄清,在mongoDB支持的扩展json格式中,shell模式(非严格模式)中的日期字段可以支持0000-9999范围之外的日期,mongoDB可以理解为如下形式的带符号64位整数:

     mongos> new Date(1313124124122341)
     ISODate("43581-03-31T21:08:42.341Z")
     mongos> 
     mongos> new Date(-121213232233222)
     ISODate("-1872-11-27T01:42:46.778Z")
     mongos>
    
    在严格模式下,是ISO-8601日期格式,在模板YYYY-MM-DDTHH:MM:ss.mmm之后有一个强制时区字段

    在Shell模式中,是64位有符号整数的JSON表示形式,表示自UTC纪元起的毫秒数

    严格模式:

     { "$date": "<date>" }
    
    {“$date”:“}
    
    mongo外壳模式:

     new Date ( <date> )
    
    新日期()
    

    在内部,日期对象存储为有符号64位整数,表示自Unix纪元(1970年1月1日)以来的毫秒数

    并非所有数据库操作和驱动程序都支持完整的64位范围。您可以安全地使用年数在0到9999之间的日期。


    因此,非常感谢@Alex&@Wernfried提供提示

    ISODate
    new Date
    的别名,是mongo shell的函数,即不是“真实”数据。使用
    mongoexport
    导出文档并查看其原始值。可能是公元前229年,但mongo shell没有正确实施。这一定与这个小字有关,因为客户端驱动程序切换到BSON v2时有点不一致,所以我猜这是“为什么会发生”。@WernfriedDomscheit:mongoexport添加的结果,通常不应该是公元前229年,从文档_id中提取日期,并显示:ObjectId(“5c6e8c6ce0ebbb309ce0dc06”).getTimestamp()ISODate(“2019-02-21T11:33:00Z”),这是预期的创建日期。。。但仍不清楚是如何改变的,可能是因为BSON v2,但这一更改似乎只影响indexesWhat server版本和shell版本?当前:4.0.19,插入时:3.4