如何让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。
- 先安装并导入工具函数:
npm install @aws-sdk/util-dynamodb
import { unmarshall } from "@aws-sdk/util-dynamodb";
- 修改
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
相关产品推荐
相关产品推荐

