AWS DMS MongoDB迁移至Postgres时嵌套字段列过滤失效问题
故障原因
AWS DMS 以MongoDB为源端做列过滤时,两个默认逻辑直接导致嵌套字段被跳过:
- 列过滤执行顺序优先于嵌套文档打平逻辑:DMS读取Mongo源文档时,会先匹配顶层字段的过滤规则,只有被纳入包含范围的顶层字段,才会进入后续的嵌套解析、字段打平流程。当前包含规则里没有添加嵌套字段所属的顶层对象
Params,DMS在读取阶段就直接丢弃了整个Params对象,后续根本不会解析Params下的name、age字段。 - 默认配置下DMS不会对未显式声明的嵌套层级做字段裁剪:如果只写点分隔的嵌套字段路径、不开启嵌套字段过滤开关,DMS会把这类路径识别为不存在的顶层字段,直接忽略不做处理。
配置解决方法
按以下步骤调整任务配置即可实现嵌套字段的精准列迁移:
- 调整表映射的Include-column规则顺序
- 首先在包含列列表中添加顶层字段
Params,必须排在它的子字段前面,且不能对Params字段配置任何排除规则,否则会导致整个对象下的子字段规则全部失效。 - 再依次添加需要同步的嵌套字段
Params.name、Params.age,和已有的顶层字段oid__id、phone_no、address放在同一规则集下。
- 首先在包含列列表中添加顶层字段
- 修改MongoDB源端点的额外连接属性
进入DMS源端点配置页,在「额外连接属性」栏添加以下参数:nestingLevel=2; filterNestedColumns=true;nestingLevel对应嵌套文档的解析深度,当前字段是Params下直接挂载的一级子字段,设置为2即可;如果存在更深层级的嵌套,按实际最大深度调整数值。filterNestedColumns=true是开启嵌套字段过滤的开关,打开后DMS才会在保留Params顶层对象的前提下,按配置的子字段列表做裁剪,不会把Params下所有无关字段都同步到目标端。
- 调整目标端字段映射(可选但推荐)
DMS打平后的嵌套字段名默认带.分隔符,PostgreSQL中带特殊字符的列名需要双引号包裹才能正常读写,建议在表映射的字段转换规则里,把Params.name映射为params_name、Params.age映射为params_age,避免后续业务读写目标表出现语法错误。
配置完成后建议先用单条测试文档做小规模全量同步验证,确认目标端字段同步符合预期后,再启动正式的全量+增量迁移任务。
内容的提问来源于stack exchange,提问作者Aim_headshot
相关产品推荐
相关产品推荐

