如何在不覆盖数据的情况下重命名MongoDB字段?
无风险重命名MongoDB字段的分步方案
要避免迁移期间覆盖新创建的foo.two字段,得采用兼容新旧字段的渐进式迁移方案,分四步执行:
第一步:修改应用代码,兼容双字段读写
先让应用同时支持one和two两个字段:- 读取数据时:优先取
two字段,如果不存在则 fallback 到one - 写入/更新数据时:同时给
one和two字段赋值
这一步确保迁移期间,不管是旧数据还是新写入的数据,应用都能正常工作,且新数据会同时保留两个字段,不会出现后续迁移覆盖的问题。
- 读取数据时:优先取
第二步:批量迁移历史数据(仅处理无
two的文档)
用带条件的批量更新命令,只对存在one但不存在two的文档执行重命名,这样就不会覆盖迁移期间应用新创建的two字段:db.foo.updateMany( { one: { $exists: true }, two: { $exists: false } }, { $rename: { 'one': 'two' } } )可以多次执行这个命令,直到返回的
modifiedCount为0,确保所有历史数据都完成迁移。第三步:切换应用到仅使用
two字段
确认所有历史数据都已迁移完成后,修改应用代码:- 读取数据时只取
two字段 - 写入/更新数据时只操作
two字段
这一步完成后,one字段就不再被应用使用了。
- 读取数据时只取
第四步:清理冗余的
one字段(可选)
如果不需要保留one字段,最后可以批量删除所有文档中的one字段:db.foo.updateMany( { one: { $exists: true } }, { $unset: { 'one': "" } } )
内容的提问来源于stack exchange,提问作者taw
相关产品推荐
相关产品推荐

