使用MongoDB updateMany将字符串日期转ISODate遇错求助
MongoDB字符串日期转ISODate的updateMany正确用法
问题说明
需要通过updateMany操作,将集合中存储为字符串类型的QCDate字段转换为ISODate格式,尝试两种方法均触发报错:
方法1及报错信息
执行命令:
db.collection.updateMany( { QCDate: { $exists: true } }, [ { $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate" } } } } } ] )
错误提示:
node:572942) UnhandledPromiseRejectionWarning: MongoError: Wrong type for 'u'. Expected a object, got a array.
方法2及报错信息
执行命令:
db.collection.updateMany( { QCDate: { $exists: true } },{ $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate" } } } } } )
错误提示:
(node:570001) UnhandledPromiseRejectionWarning: MongoError: The dollar ($) prefixed field '$toDate' in 'QCDate.$toDate' is not valid for storage.
错误原因
- 方法1报错:你的MongoDB版本低于4.2,不支持以聚合管道数组作为
updateMany的更新参数,该特性从4.2版本才开始支持。 - 方法2报错:普通对象形式的更新语句不允许使用聚合操作符(如
$toDate、$dateFromString),MongoDB会将$toDate识别为要存储的字段名,而集合不允许存储以$开头的字段。
正确解决办法
方案1:MongoDB版本≥4.2(优先推荐)
使用聚合管道式更新,若你的日期字符串是非标准格式,可额外指定format参数匹配格式:
db.collection.updateMany( { QCDate: { $exists: true, $type: "string" } }, // 精准匹配字符串类型的目标字段 [ { $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate" } } } } } ] )
示例:若日期字符串格式为"YYYY-MM-DD HH:mm:ss",补充格式参数:
db.collection.updateMany( { QCDate: { $exists: true, $type: "string" } }, [ { $set: { QCDate: { $toDate: { $dateFromString: { dateString: "$QCDate", format: "%Y-%m-%d %H:%M:%S" // 根据实际日期格式调整 } } } } } ] )
方案2:MongoDB版本<4.2
若无法升级版本,需遍历文档逐个更新:
db.collection.find({ QCDate: { $exists: true, $type: "string" } }).forEach(doc => { const isoDate = new Date(doc.QCDate); db.collection.updateOne( { _id: doc._id }, { $set: { QCDate: isoDate } } ); })
注意:该方法在数据量较大时效率较低,建议优先升级MongoDB版本使用管道更新。
内容的提问来源于stack exchange,提问作者Pranali solaskar
相关产品推荐
相关产品推荐

