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

如何让DynamoDB查询结果直接返回字符串或数值类型?

如何让DynamoDB查询响应直接返回字符串/数值格式?

你当前使用TypeScript从DynamoDB获取数据的代码如下:

async fetchData(params: QueryParams) {
    return await this.docClient.send(new QueryCommand(params));
  }

const dbObject: QueryParams = {
        TableName: process.env.TABLE_NAME,
        KeyConditionExpression: "PK = :id",
        FilterExpression: "ACTIVE = :active",
        ExpressionAttributeValues: {
          ":id": { S: id },
          ":active": { S: "Y" },
        },
        ProjectionExpression:
          "FUND_MANAGER, FUND_NAME,PRICE_DECIMAL ,ANNUALIZED_YIELD,YTD_GROWTH, AUM_VALUE",
      };

当前返回的响应是带类型标记的DynamoDB原生格式:

{
"Id": {
"S": "456"
},
"Price": {
"N": "650"
},
"ProductCategory": {
"S": "Sporting Goods"
}
}

想要转换为直接包含字符串、数值的普通JSON格式:

{ "Id": "456", "Price": 650 }

以下是两种可行的解决方案:

方法1:使用AWS SDK内置的unmarshall工具

AWS SDK v3提供了@aws-sdk/util-dynamodb包,其中的unmarshall函数可以一键将DynamoDB格式的对象转换为普通JSON。

  1. 先安装并导入工具函数:
npm install @aws-sdk/util-dynamodb
import { unmarshall } from "@aws-sdk/util-dynamodb";
  1. 修改fetchData方法,对返回结果进行转换:
async fetchData(params: QueryParams) {
  const rawResponse = await this.docClient.send(new QueryCommand(params));
  // 对每个查询到的Item执行转换
  const formattedItems = rawResponse.Items?.map(item => unmarshall(item)) || [];
  // 返回保留原响应结构但替换Items的结果
  return { ...rawResponse, Items: formattedItems };
}

方法2:手动编写解析逻辑

如果不想额外依赖工具包,可以自己实现类型解析函数,遍历对象提取对应值:

// 解析单个DynamoDB Item的函数
function parseDynamoItem(item: Record<string, any>): Record<string, any> {
  const result: Record<string, any> = {};
  for (const [key, value] of Object.entries(item)) {
    const typeKey = Object.keys(value)[0];
    switch (typeKey) {
      case 'S': // 字符串类型
        result[key] = value.S;
        break;
      case 'N': // 数值类型
        result[key] = Number(value.N);
        break;
      case 'BOOL': // 布尔类型
        result[key] = value.BOOL;
        break;
      // 可根据需求添加数组(L)、嵌套对象(M)等其他类型的处理逻辑
      default:
        result[key] = value[typeKey];
    }
  }
  return result;
}

// 修改fetchData方法应用解析
async fetchData(params: QueryParams) {
  const rawResponse = await this.docClient.send(new QueryCommand(params));
  const formattedItems = rawResponse.Items?.map(parseDynamoItem) || [];
  return { ...rawResponse, Items: formattedItems };
}

额外优化:简化查询参数写法

你当前的ExpressionAttributeValues手动指定了类型(如{ S: id }),实际上使用DocumentClient时可以直接传入原始值,SDK会自动映射为对应的DynamoDB类型:

const dbObject: QueryParams = {
  TableName: process.env.TABLE_NAME,
  KeyConditionExpression: "PK = :id",
  FilterExpression: "ACTIVE = :active",
  ExpressionAttributeValues: {
    ":id": id, // 直接传字符串,SDK自动转为{S: id}
    ":active": "Y"
  },
  ProjectionExpression: "FUND_MANAGER, FUND_NAME, PRICE_DECIMAL, ANNUALIZED_YIELD, YTD_GROWTH, AUM_VALUE",
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:03:14