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

DynamoDB NodeJS SDK从V2迁移至V3:Set类型数据获取差异问题

解决DynamoDB V3 SDK返回原生Set替代V2自定义Set的问题

为啥会出现这个差异

AWS JS SDK V3 默认把DynamoDB里的NS(数字集合)、SS(字符串集合)直接转成原生JS Set对象,而V2用的是SDK自己封装的Set结构(带wrapperName、values、type那套字段)。这是V3在数据反序列化(把DynamoDB格式转成JS对象)时的默认行为,和你排查的编组(marshalling,把JS对象转成DynamoDB格式)没关系。

两种解决办法

办法1:改反序列化配置,返回V2风格的Set

如果你用@aws-sdk/util-dynamodb里的unmarshall函数处理查询结果,加个convertToNative: false参数就行:

import { unmarshall } from "@aws-sdk/util-dynamodb";

// 假设这是getItem拿到的原始DynamoDB格式数据
const rawItem = {
  "hitCount": {
    "NS": ["5", "4", "3", "2", "1"]
  }
};

// 配置后返回和V2一致的Set结构
const item = unmarshall(rawItem, { convertToNative: false });
console.log(item.hitCount);
// 输出:{ wrapperName: 'Set', values: [5,4,3,2,1], type: 'Number' }

要是你用的是DynamoDBDocumentClient(V3的文档客户端,默认帮你做序列化反序列化),创建客户端时要配置unmarshallOptions:

import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";

const client = new DynamoDBClient({});
const docClient = DynamoDBDocumentClient.from(client, {
  unmarshallOptions: {
    convertToNative: false
  }
});

办法2:手动把原生Set转成你要的格式

不想改全局配置的话,拿到结果后自己转一下:

// 假设V3 getItem返回的item里,hitCount是原生Set
const { Item } = await docClient.send(new GetItemCommand(params));
const hitCount = {
  wrapperName: "Set",
  values: Array.from(Item.hitCount),
  type: "Number"
};

内容的提问来源于stack exchange,提问作者gnichola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:52:17