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
三种尝试的数据集分别是:
- 数字时间戳格式
{ device_uid: 'ht', metadata: { type: 'h&t' }, timestamp: 1710859285918, measure: { status: 'off' } }
- ISO日期字符串格式
{ device_uid: 'ht', metadata: { type: 'h&t' }, timestamp: '2024-03-19T14:46:26.040Z', measure: { temperature_celsius: 12.380277178155694, humidity_perce: 74.98333906368329 } }
- 字符串形式的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对象即可,对应三种场景的修正代码:
- 从数字时间戳转换
{ device_uid: 'ht', metadata: { type: 'h&t' }, timestamp: new Date(1710859285918), measure: { status: 'off' } }
- 从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 } }
- 替代字符串形式的ISODate
{ metadata: { device_uid: 'ht' }, timestamp: new Date('2024-03-19T14:53:56.274Z'), measure: { status: 'on' } }
若需写入当前时间,直接使用new Date()即可,客户端会自动处理为BSON DateTime类型。
内容的提问来源于stack exchange,提问作者realtebo
相关产品推荐
相关产品推荐

