MongoDB使用updateMany将数组中due_date字符串转为日期格式
MongoDB数组中字符串日期转Date类型的解决方法
问题场景
集合文档包含checklist数组,其中due_date存在三种状态:null、空字符串""、ISO格式的日期字符串。需要将有效日期字符串转为Date类型,空字符串转为null,保留原有null值。
已成功将空字符串转为null,但尝试转换日期字符串时,错误存入了字符串"$$checklist.due_date",而非实际日期类型。
错误原因
之前的更新语句中,引用数组元素时误用了$$checklist.due_date,而数组过滤器定义的变量是check,正确引用应为$$check.due_date;同时需确保MongoDB版本≥4.2,该版本才支持在更新操作中使用聚合表达式。
解决方案
方法1:一次性处理所有情况
使用聚合更新结合$map、$cond,遍历数组并统一处理三种due_date状态,同时保留其他字段:
db.collection.updateMany( {}, [ { $set: { "checklist": { $map: { input: "$checklist", as: "item", in: { $mergeObjects: [ "$$item", { due_date: { $cond: [ { $and: [ { $eq: [{ $type: "$$item.due_date" }, "string"] }, { $ne: ["$$item.due_date", ""] }] }, { $toDate: "$$item.due_date" }, { $cond: [ { $eq: ["$$item.due_date", ""] }, null, "$$item.due_date" ] } ] } } ] } } } } } ] )
方法2:分步处理
先执行你已完成的空字符串转null操作,再运行以下语句转换有效日期字符串:
db.collection.updateMany( { "checklist.due_date": { $type: "string", $ne: "" } }, [ { $set: { "checklist.$[check].due_date": { $toDate: "$$check.due_date" } } } ], { arrayFilters: [ { "check.due_date": { $type: "string", $ne: "" } } ] } )
注意:此方法要求MongoDB版本≥4.2,因为更新操作中使用了聚合表达式$toDate。
核心逻辑说明
$map遍历checklist数组,逐个处理元素;$mergeObjects保留数组元素的is_completed、is_deleted等原有字段,仅更新due_date;$cond嵌套判断:先识别非空字符串并转为Date类型,再将空字符串转为null,其余情况(如原null值)保持不变。
内容的提问来源于stack exchange,提问作者Omkar
相关产品推荐
相关产品推荐

