You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)有两个问题:

  1. new Date('datetime')会创建一个无效的Date对象(字符串'datetime'不是合法日期格式),应该调用文档里实际的datetime字段,也就是doc.datetime
  2. 就算传入合法的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:50:52