使用AWS DMS迁移DocumentDB时如何生成新的ObjectId类型_id
解决方法:将DocumentDB嵌套结构
_id转为ObjectId 一、通过AWS DMS实现
正确配置转换规则与端点设置
- 调整转换规则:
- 添加两条规则确保源的嵌套
_id被移除,且目标自动生成ObjectId:- 规则1(源表):针对
my-schema.my-table,设置Action为Remove,Path为$_id(JSONPath格式,精准匹配嵌套的_id字段)。 - 规则2(目标表):针对
my-new-schema.my-table,设置Action为Add,Path为$_id,不指定Value——DMS会自动为新插入的文档生成标准ObjectId。
- 规则1(源表):针对
- 添加两条规则确保源的嵌套
- 端点元数据模式配置:
- 源、目标端点均选择文档元数据模式(Document metadata mode),避免DMS将嵌套字段展平(这是之前触发"Document can't have '.' in field names"错误的原因)。
- 任务补充设置:
- 开启任务的「Enable auto creation of collection」选项,确保目标表能被自动创建,且DMS正常生成ObjectId。
常见问题排查
- 若之前移除
_id的规则未生效,检查规则的SchemaName、TableName是否与实际完全匹配,Path是否使用正确的JSONPath格式($_id而非仅_id)。
二、通过MongoDB命令直接实现(更高效)
如果不想依赖DMS,可直接用DocumentDB的聚合或更新命令完成转换,以下两种方式按需选择:
方式1:复制数据到新schema并生成ObjectId(推荐,保留原数据)
// 切换到目标schema use my-new-schema // 从源schema读取数据,移除嵌套_id,自动生成新ObjectId后写入目标表 db.getSiblingDB('my-schema')['my-table'].aggregate([ { $project: { // 排除源的嵌套_id,保留其他所有字段 _id: 0, // 保留所有原有字段(除_id外) ...$$ROOT, _id: "$$REMOVE" } }, { $out: "my-table" // 将处理后的数据写入目标表 } ])
方式2:直接修改原表数据(需先备份)
// 切换到源schema use my-schema // 为所有文档生成新的ObjectId替换嵌套_id db['my-table'].updateMany( {}, // 匹配所有文档 [ { $set: { _id: ObjectId() // 生成标准ObjectId } } ] )
内容的提问来源于stack exchange,提问作者Himanshu Dabas
相关产品推荐
相关产品推荐

