如何在AWS Lambda(Node.js)中实现DynamoDB双条件查询?
在AWS Lambda(Node.js)中查询DynamoDB多条件匹配数据
假设你的DynamoDB表中id是分区键(主键),以下是两种实用的实现方式:
方式1:使用GetItem(高性能,适用于主键唯一场景)
GetItem会直接通过主键定位条目,再判断name是否匹配,是性能最优的方案:
const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb"); const { unmarshall } = require("@aws-sdk/util-dynamodb"); // 初始化DynamoDB客户端,替换为你的AWS区域 const client = new DynamoDBClient({ region: "us-east-1" }); exports.handler = async (event) => { try { const params = { TableName: "你的表名", Key: { id: { S: "1" } // S代表字符串类型,需与表中字段类型一致 } }; const command = new GetItemCommand(params); const response = await client.send(command); if (response.Item) { const item = unmarshall(response.Item); if (item.name === "John") { return { statusCode: 200, body: JSON.stringify(item) }; } else { return { statusCode: 404, body: JSON.stringify({ message: "未找到匹配条件的条目" }) }; } } else { return { statusCode: 404, body: JSON.stringify({ message: "未找到id为1的条目" }) }; } } catch (error) { return { statusCode: 500, body: JSON.stringify({ error: error.message }) }; } };
方式2:使用Query配合过滤条件(适用于主键不唯一或批量过滤场景)
如果id不是唯一主键,或需要基于索引批量查询,可以用Query结合FilterExpression过滤name字段:
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb"); const { unmarshall } = require("@aws-sdk/util-dynamodb"); const client = new DynamoDBClient({ region: "us-east-1" }); exports.handler = async (event) => { try { const params = { TableName: "你的表名", KeyConditionExpression: "id = :idVal", // 匹配分区键 FilterExpression: "name = :nameVal", // 过滤name字段 ExpressionAttributeValues: { ":idVal": { S: "1" }, ":nameVal": { S: "John" } } }; const command = new QueryCommand(params); const response = await client.send(command); // 将DynamoDB格式数据转换为普通JS对象 const items = response.Items.map(item => unmarshall(item)); return { statusCode: 200, body: JSON.stringify(items) }; } catch (error) { return { statusCode: 500, body: JSON.stringify({ error: error.message }) }; } };
关键注意事项
- 确保Lambda执行角色拥有
dynamodb:GetItem或dynamodb:Query权限,避免权限报错。 - 字段类型需与表中定义一致:
S为字符串、N为数字、BOOL为布尔值等。 - 若需频繁按
id+name组合查询,建议设置复合主键(分区键id+排序键name),这样Query可直接命中索引,无需后续过滤,性能更佳。
内容的提问来源于stack exchange,提问作者noBoom
相关产品推荐
相关产品推荐

