MongoDB添加timestampCreated字段报错:timestamp必须为数字的技术问询
解决MongoDB添加Timestamp字段时报错
error:timestamp must be in number的问题 看起来你是想把集合里已有的ISOdate格式datetime字段转成MongoDB的Timestamp类型存到timestampCreated里,但踩了个小细节坑——MongoDB的Timestamp构造函数的参数要求和你想的不一样。
为什么会报错?
MongoDB内置的Timestamp()类型主要是给内部oplog复制机制用的,不是普通业务场景的常规日期类型,而且它的两个参数都必须是数字:
- 第一个参数是从Unix纪元开始的秒数(纯数字类型)
- 第二个参数是0到2^32-1之间的序数(数字,一般传0即可)
你代码里的new Timestamp(new Date('datetime'), 0)有两个问题:
new Date('datetime')会创建一个无效的Date对象(字符串'datetime'不是合法日期格式),应该调用文档里实际的datetime字段,也就是doc.datetime- 就算传入合法的Date对象,
Timestamp()也不接受Date类型,必须转成数字格式的秒数
正确的解决方法
根据你的需求,分两种场景处理:
场景1:确实需要MongoDB的Timestamp类型
把datetime字段的Date对象转换成Unix秒数(除以1000取整),再传给Timestamp():
var cursor = db.getCollection('test').find(); while (cursor.hasNext()) { var doc = cursor.next(); // 将Date对象转为Unix时间戳的秒数(getTime()返回毫秒数,需除以1000取整) var unixSeconds = Math.floor(doc.datetime.getTime() / 1000); db.getCollection('test').update( {_id: doc._id}, {$set: {'timestampCreated': new Timestamp(unixSeconds, 0)}} ); }
场景2:只是需要普通时间戳数字(更推荐)
如果你的场景只是记录创建时间的时间戳,完全没必要用MongoDB的Timestamp类型,直接存毫秒级Unix时间戳数字更直观、通用:
var cursor = db.getCollection('test').find(); while (cursor.hasNext()) { var doc = cursor.next(); // getTime()返回从Unix纪元开始的毫秒数,直接存数字即可 db.getCollection('test').update( {_id: doc._id}, {$set: {'timestampCreated': doc.datetime.getTime()}} ); }
额外提醒
如果你的datetime字段是字符串格式的ISO日期(比如"2024-05-20T10:30:00Z"),需要先转成Date对象再处理:
var dateObj = new Date(doc.datetime); var unixSeconds = Math.floor(dateObj.getTime() / 1000);
内容的提问来源于stack exchange,提问作者Gagan Deep
相关产品推荐
相关产品推荐

