MongoDB 6.x嵌套文档数组字段重命名迁移方案咨询
MongoDB 6.x 嵌套字段及数组内嵌套字段重命名迁移方案
完整迁移代码
db.yourCollection.updateMany( {}, // 匹配所有文档,如需仅处理特定文档可添加过滤条件 [ // 1. 迁移顶层 assignment.carrier.name 到 companyName { $set: { "assignment.carrier.companyName": "$assignment.carrier.name" } }, // 2. 迁移 eventLog 数组内的 assignment.carrier.name 到 companyName { $set: { eventLog: { $map: { input: "$eventLog", as: "log", in: { $mergeObjects: [ "$$log", { $cond: { if: { $ne: ["$$log.assignment", undefined] }, then: { assignment: { $mergeObjects: [ "$$log.assignment", { carrier: { $mergeObjects: [ "$$log.assignment.carrier", { companyName: "$$log.assignment.carrier.name" } ] } } ] } }, else: {} } } ] } } } } }, // 3. 移除所有旧的 name 字段 { $unset: [ "assignment.carrier.name", "eventLog.assignment.carrier.name" ] } ] )
代码说明
- 顶层字段迁移:直接通过
$set赋值,点路径运算符在顶层嵌套字段中可正常生效,将原name字段的值复制到新的companyName字段。 - 数组内字段迁移:
- 用
$map遍历eventLog数组的每一个元素; - 用
$mergeObjects保留日志元素的原有结构,仅对包含assignment的元素修改嵌套字段; - 逐层合并
assignment和carrier对象,确保原有字段不丢失的同时添加新字段。
- 用
- 删除旧字段:通过
$unset一次性移除顶层和数组内的旧name字段,MongoDB会自动遍历数组所有元素完成删除。
常见问题说明
如果之前尝试直接在$map中用点路径赋值(如"$$log.assignment.carrier.companyName": "$$log.assignment.carrier.name")会失败,原因是在数组映射的上下文里,无法直接通过点路径修改嵌套对象的字段,必须使用$mergeObjects来合并对象结构实现字段添加/修改。
内容的提问来源于stack exchange,提问作者Enthusiast
相关产品推荐
相关产品推荐

