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

Node.js用mongodb客户端写入MongoDB时间序列集合时timestamp字段报错

MongoDB时间序列集合写入报错问题排查

问题描述

我创建了如下MongoDB时间序列集合:

db.createCollection(
  "raw_data",
  {
    timeseries: {
        timeField: "timestamp",
        metaField: "metadata"
    }
  }
)

使用Node.js的mongodb客户端写入数据时,先后尝试了三种不同格式的timestamp值,每次都收到错误:

MongoServerError: 'timestamp' must be present and contain a valid BSON UTC datetime value

三种尝试的数据集分别是:

  1. 数字时间戳格式
{
  device_uid: 'ht',
  metadata: { type: 'h&t' },
  timestamp: 1710859285918,
  measure: { status: 'off' }
}
  1. ISO日期字符串格式
{
  device_uid: 'ht',
  metadata: { type: 'h&t' },
  timestamp: '2024-03-19T14:46:26.040Z',
  measure: {
    temperature_celsius: 12.380277178155694,
    humidity_perce: 74.98333906368329
  }
}
  1. 字符串形式的ISODate格式
{
  metadata: { device_uid: 'ht' },
  timestamp: 'ISODate("2024-03-19T14:53:56.274Z")',
  measure: { status: 'on' }
}

错误原因与修正方案

MongoDB时间序列集合要求timeField必须是BSON DateTime类型,你的三种写法都未满足该要求,具体问题和修正方式如下:

  • 数字时间戳:直接传入的数字会被识别为BSON的Number类型,并非DateTime类型。需将数字转换为JavaScript的Date对象,客户端会自动将其转为BSON DateTime。
  • ISO日期字符串:字符串类型不被MongoDB时间序列集合认可,必须转为Date对象。
  • 字符串形式的ISODate:这是Mongo Shell专属语法,Node.js客户端会将其当作普通字符串处理,不属于有效DateTime类型。

正确写入格式示例

将timestamp字段的值替换为JavaScript的Date对象即可,对应三种场景的修正代码:

  1. 从数字时间戳转换
{
  device_uid: 'ht',
  metadata: { type: 'h&t' },
  timestamp: new Date(1710859285918),
  measure: { status: 'off' }
}
  1. 从ISO字符串转换
{
  device_uid: 'ht',
  metadata: { type: 'h&t' },
  timestamp: new Date('2024-03-19T14:46:26.040Z'),
  measure: {
    temperature_celsius: 12.380277178155694,
    humidity_perce: 74.98333906368329
  }
}
  1. 替代字符串形式的ISODate
{
  metadata: { device_uid: 'ht' },
  timestamp: new Date('2024-03-19T14:53:56.274Z'),
  measure: { status: 'on' }
}

若需写入当前时间,直接使用new Date()即可,客户端会自动处理为BSON DateTime类型。


内容的提问来源于stack exchange,提问作者realtebo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:12:40