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

Lambda调用DynamoDB返回带类型标识结果,如何获取纯键值对?

问题:DynamoDB查询返回带类型标识的格式,如何转为纯键值对?

场景说明

我正在学习Lambda,我的DynamoDB数据集模型如下:

{
  "id": "String",
  "question": "String",
  "answer": "String",
  "learned": "Boolean"
}

使用AWS员工协助编写的Lambda函数(基于@aws-sdk/client-dynamodb)执行Scan操作时,能成功返回结果,但格式包含数据类型标识,不符合预期:

实际返回格式:

{
  "question": {
    "S": "What is the name of your Judo organization?"
  },
  "learned": {
    "BOOL": false
  },
  "Id": {
    "S": "2"
  },
  "answer": {
    "S": "United States Judo Association"
  }
}

期望返回格式:

{
  "question": "What is the name of your Judo organization?",
  "learned": false,
  "Id": "2",
  "answer": "United States Judo Association"
}

同时有疑问:这种带类型的结果是不是仅在Lambda测试中可见,实际JSON API返回不会包含?


解决方案

这不是DynamoDB表的配置问题,而是因为你使用的DynamoDBClient是AWS SDK的低级客户端,它返回的是DynamoDB原生数据格式(包含类型标识),不管是测试还是实际API返回都会是这个格式,必须手动处理转换。

有两种常用处理方式:

1. 使用unmarshall工具转换数据

从@aws-sdk/util-dynamodb导入unmarshall函数,遍历返回的Items逐个转换:

import { DynamoDBClient, ScanCommand } from "@aws-sdk/client-dynamodb";
import { unmarshall } from "@aws-sdk/util-dynamodb";

const client = new DynamoDBClient({});

export const handler = async function(event, context, callback) {
  
  const command = new ScanCommand({
    TableName: "Vocabulary",
  });

  const response = await client.send(command);
  // 将每个带类型的Item转为纯键值对
  const formattedItems = response.Items.map(item => unmarshall(item));
  
  formattedItems.forEach(item => console.log(item));
  // 返回转换后的结果
  return { Items: formattedItems };
};

2. 使用DynamoDBDocumentClient(更简便)

直接使用专门处理文档格式的客户端,它会自动完成类型转换,无需手动调用转换工具:

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

const client = new DynamoDBClient({});
// 基于基础客户端创建文档客户端
const docClient = DynamoDBDocumentClient.from(client);

export const handler = async function(event, context, callback) {
  
  const command = new ScanCommand({
    TableName: "Vocabulary",
  });

  const response = await docClient.send(command);
  
  response.Items.forEach(item => console.log(item));
  return response;
};

补充说明

不管是在Lambda测试控制台还是通过API Gateway等方式触发返回,只要使用DynamoDBClient,返回的都会是带类型标识的格式,必须通过上述方法转换才能得到纯键值对结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:02:44