You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS DMS迁移DocumentDB时如何生成新的ObjectId类型_id

解决方法:将DocumentDB嵌套结构_id转为ObjectId

一、通过AWS DMS实现

正确配置转换规则与端点设置

  1. 调整转换规则:
    • 添加两条规则确保源的嵌套_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。
  2. 端点元数据模式配置:
    • 源、目标端点均选择文档元数据模式(Document metadata mode),避免DMS将嵌套字段展平(这是之前触发"Document can't have '.' in field names"错误的原因)。
  3. 任务补充设置:
    • 开启任务的「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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:01:01