使用 lambda 扫描/查询 dynamodb 表中的特定条目
Posted
技术标签:
【中文标题】使用 lambda 扫描/查询 dynamodb 表中的特定条目【英文标题】:Scanning/querying specific entries in a dynamodb table with lambda 【发布时间】:2022-01-08 20:35:36 【问题描述】:我正在使用 AWS 并使用 API 来触发 lambda,而 lambda 包含 dynamodb 的 CRUD 代码。例如,这段代码(在 lambda 函数中)扫描并返回所有对象:
app.get(path, function (req, res)
var params =
TableName: tableName,
Select: 'ALL_ATTRIBUTES',
;
dynamodb.scan(params, (err, data) =>
if (err)
res.json( error: 'Could not load items: ' + err.message );
res.json(
data: data.Items.map(item =>
return item;
),
);
);
);
这很好用,我一直在用邮递员测试它。 我现在想从不是分区键的表中查询与特定 ID 匹配的所有项目。例如:假设我有一个包含书籍的数据库。 PK是书名。还有一个属性是 bookyear。多本书可以有 1997 年的书年。现在我想编辑我的查询/扫描,以便它找到并返回所有书年为 1997 年的书。 解决此问题的最佳方法是什么? 提前致谢。
编辑 nr 100: 我现在正在使用此代码:
这很酷,因为查询现在有效! json.tringify(data) 给了我我想要的 2 个数据库项目,太棒了! 我现在正试图将其返回到我在邮递员中的测试情况。但不幸的是,我收到一条“消息”:“内部服务器错误” 所以我认为返回 data.Items 不太对。
【问题讨论】:
即使扫描调用返回错误,您的代码似乎也在尝试对项目进行 JSON 化。将其移至其他路径。另外,将 console.log(err) 添加到if (err)
路径。
从回调函数中返回一个值(例如return data.Items
)对最初调用的函数(在您的情况下为dynamodb.query
)的返回值没有任何影响。这是标准的异步 javascript。
谢谢。我用这个: res.json( data: data.Items.map(item => return item; ), ); );我不确定它到底做了什么,但它有效,我现在会研究它!我仍然是一名试图解决这个问题的学生,所以我很感激你的帮助!
【参考方案1】:
您对dynamodb.scan
的调用失败,因为您传递了无效参数。具体来说,它不支持KeyConditionExpression
。这在query
中有效,但在scan
中无效。您可能打算使用FilterExpression
。
您看不到这一点,因为您的错误处理代码没有正确显示错误。
关于您如何返回所有书籍的 bookyear 1997 的问题......您可以在 bookyear 上添加一个全球二级索引,然后使用该 GSI 发出查询。这比使用过滤器的全扫描性能更高。
【讨论】:
感谢您的帮助!正如您在我编辑的帖子中看到的那样,我决定查询 GSI。现在效果很好。我花了一段时间才弄清楚日志记录也是可见的并且 cloudwatch 所以我只是从那里调试。现在要弄清楚到底要返回什么..以上是关于使用 lambda 扫描/查询 dynamodb 表中的特定条目的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node 从 Lambda 查询 Dynamodb - 缺少键
如何使用 AWS Lambda 按名称查询 dynamoDB 表
AWS Lambda:即使在STS:AssumeRole成功之后,lambda函数仍然使用旧的IAM角色
AWS SDK JavaScript v3 / 如何在 dynamoDB 扫描命令中使用 ExpressionAttributeNames?