mongodb中的日期字段不一致,为什么会发生,如何识别和修复
我最近在我的mongod 4.0中发现了具有以下内容的日期字段: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") 因此,我的问题是
"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 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