MongoDB含日期字段的对象数组更新问题求助
MongoDB更新对象数组内日期字段的解决方案
完整更新语句
使用聚合管道形式的updateOne,可以同时更新顶层日期字段和数组内的日期字段:
db.teacher.updateOne( { _id: "6434cf" }, // 替换为目标文档的_id [ { $set: { start_time: { $dateAdd: { startDate: "$start_time", unit: "minute", amount: 60 } }, end_time: { $dateAdd: { startDate: "$end_time", unit: "minute", amount: 60 } }, time_slots: { $map: { input: "$time_slots", as: "slot", in: { sl_no: "$$slot.sl_no", dateTime: { $dateAdd: { startDate: "$$slot.dateTime", unit: "minute", amount: 60 } } } } } } } ] )
核心逻辑说明
- 采用聚合管道更新模式,支持引用文档自身字段进行计算
- 顶层的
start_time和end_time直接用$dateAdd追加指定时长 - 对于
time_slots数组,使用$map遍历每个元素:保留sl_no字段不变,对dateTime执行相同的$dateAdd操作 amount参数设为60对应延迟1小时,可根据需求调整数值
示例文档
db={ "teacher": [ { "_id": "6434cf", "start_time": ISODate("2023-03-22T07:00:25.787Z"), "end_time": ISODate("2023-03-22T10:00:35.604Z"), "duration": "15min", "time_slots": [ { "sl_no": 1, "dateTime": ISODate("2023-03-22T06:30:25.787Z") }, { "sl_no": 2, "dateTime": ISODate("2023-03-22T06:45:25.787Z") } ] }, { "_id": "6434ctd", "start_time": ISODate("2023-03-23T07:00:25.787Z"), "end_time": ISODate("2023-03-23T10:00:35.604Z"), "duration": "20min", "time_slots": [ { "sl_no": 1, "dateTime": ISODate("2023-03-23T06:30:25.787Z") }, { "sl_no": 2, "dateTime": ISODate("2023-03-23T06:50:25.787Z") } ] } ] }
更新后期望输出
{ "_id": "6434cf", "start_time": ISODate("2023-03-22T08:00:25.787Z"), "end_time": ISODate("2023-03-22T11:00:35.604Z"), "duration": "15min", "time_slots": [ { "sl_no": 1, "dateTime": ISODate("2023-03-22T07:30:25.787Z") }, { "sl_no": 2, "dateTime": ISODate("2023-03-22T07:45:25.787Z") } ] }
内容的提问来源于stack exchange,提问作者Rajesh Senapati
相关产品推荐
相关产品推荐

