如何使用 AWS Lambda 按名称查询 dynamoDB 表
Posted
技术标签:
【中文标题】如何使用 AWS Lambda 按名称查询 dynamoDB 表【英文标题】:How to query dynamoDB table by name using AWS Lambda 【发布时间】:2017-04-05 20:30:26 【问题描述】:我有 dynamoDB 表,
表名xx
主分区键id
(数字)
主排序键name
(字符串)
我想通过name
查询它。
'use strict';
const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB();
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function(event, ctx, callback)
var params =
TableName: 'xx',
KeyConditionExpression: "#name = :name",
ExpressionAttributeNames:
"#name": "name"
,
ExpressionAttributeValues:
":name":event.name
;
docClient.query(params, function(err, data)
if(err)
callback(err, null);
else
callback(null, data);
);
但是我得到一个错误,叫做:“查询条件错过了关键模式元素:id:”如何处理?
【问题讨论】:
【参考方案1】:DynamoDB 是一个 NoSQL 数据库,因此默认情况下您只能查询主键。您有两种选择:
创建一个全局二级索引并针对它进行查询 (Link):
“全局二级索引包含从基表中选择的属性,但它们是由不同于表的主键组织的。索引键不需要具有来自基表的任何键属性表;它甚至不需要与表具有相同的键模式。”
扫描而不是查询:
var params=
TableName:'xx',
ProjectionExpression:'name', // remove this string if you want to get not only 'name'
FilterExpression:'name = :name',
ExpressionAttributeValues: ":name" : event.name
;
docClient.scan(params, function(err, data)
if(err)
callback(err, null);
else
callback(null, data);
);
如果您的表不会很大,扫描是更简单、更便宜的方法(我相信全球二级指数有相关成本),但“正确”的方法是使用全球二级指数。
【讨论】:
实际上,这是导致解决方案的唯一答案。也许我是盲人,但我发现有关仅使用主键的查询的零信息。非常非常感谢。 只是一个简短的说明,使用scan
时必须小心。 AWS 文档建议使用 query
而不是 scan
。更多详情请查看docs.aws.amazon.com/amazondynamodb/latest/developerguide/…以上是关于如何使用 AWS Lambda 按名称查询 dynamoDB 表的主要内容,如果未能解决你的问题,请参考以下文章
lambda 函数中 api 键的 aws appsync 环境变量
如何将AWS API网关阶段指向特定的lambda函数别名?