使用 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 表中的特定条目的主要内容,如果未能解决你的问题,请参考以下文章

dynamodb 中的查询与扫描操作

使用 Node 从 Lambda 查询 Dynamodb - 缺少键

如何使用 AWS Lambda 按名称查询 dynamoDB 表

AWS Lambda:即使在STS:AssumeRole成功之后,lambda函数仍然使用旧的IAM角色

AWS SDK JavaScript v3 / 如何在 dynamoDB 扫描命令中使用 ExpressionAttributeNames?

aws - 我应该创建两个 lambda 函数来处理 dynamodb 查询和非查询用例吗?