在 DynamoDB 上扫描 table 的正确方法是什么?

Which is the correct way to scan a table on DynamoDB?

正如标题所说,我想知道在 Amazon DynamoDB 中扫描 table 的最佳方法是通过 另一个 字段而不是主键进行搜索。

我对此进行了搜索并阅读了很多,但我找到了适合我的解决方案:

let DynamoDBServiceObj = new AWS.DynamoDB({apiVersion: '2012-08-10'});

let params = {
   ExpressionAttributeValues: {
       ':hash' : { S: req.param('wildcard') }
   },
   ProjectionExpression: 'directory',
   FilterExpression: 'qrCode = :hash',
   TableName: 'business'
};

let business = await DynamoDBServiceObj.scan(params).promise();
if (business.Count == 1) return res.ok();
else return res.view('404');

这对我有用,但我也读到在 table 上执行 scan 对性能和价格来说是个坏主意。但是,那怎么办呢?

我阅读了这些帖子,我认为 GSI 是解决方案,但我不明白它是如何工作的。

正如您所说,扫描 table 不是一个好主意,您已经阅读过相关内容。我会建议两件事。

  1. 使用复合主键(如果您还没有这样做的话)。结合使用分区键和排序键,您可以根据频繁的访问模式查询(而不是扫描)您的 table。

  2. 如果您仍然需要通过复合主键中包含的属性以外的属性查询 table,那么 GSI 是正确的解决方案。您可以查看 post 了解 GSI 的工作原理。 您可以将 GSI 视为具有不同主键的 table 的副本。