Lambda NodeJS 上数组中每个值的 Query() DynamoDB

Query() DynamoDB for each value in array on Lambda NodeJS

我在 NodeJS 12x Lambda 函数中有以下代码:

targetedAliases = ["abc", "efg"]; //Not used yet. But want to replace alias with this array.
alias = "abc" //using this one aka targetedAliases[0].

const dynamoDB = new AWS.DynamoDB({
    apiVersion: "2012-10-08"
});
var aliasScores;


const params = {
    TableName: 'a-table',
    FilterExpression: '#alias = :alias',
    ExpressionAttributeNames: {
        '#alias': 'alias',
    },
    ExpressionAttributeValues: {
        ':alias': {
            S: alias
        },
    }
};

aliasScores = await dynamoDB.scan(params).promise();

console.log("====> ", aliasScores);

函数原样按预期打印 aliasScores 的内容,但我需要为 targetedAliases 数组中的每个项目执行此 n 次。

有没有一种方法可以使用 Array.forEach 或类似的东西为数组中的每个项目迭代执行 query/scan?或者,我可以在 FilterExpression 上使用数组来仅执行一次 query/scan 吗?

我想将每个 query/scan 结果存储在 aliasScores 变量中,作为所有返回对象的串联,以便在下面进一步使用它。

您可以使用 Promise.all.map 并行执行这些操作并在数组中获取结果。像这样

const targetedAliases = ["abc", "efg"]; //Not used yet. But want to replace alias with this array.
alias = "abc" //using this one aka targetedAliases[0].

const dynamoDB = new AWS.DynamoDB({
    apiVersion: "2012-10-08"
});
var aliasScores;

const result = await Promise.all(targetedAliases.map(alias => {
  const params = {
    TableName: 'a-table',
    FilterExpression: '#alias = :alias',
    ExpressionAttributeNames: {
        '#alias': 'alias',
    },
    ExpressionAttributeValues: {
        ':alias': {
            S: alias
        },
    }
};

return dynamoDB.scan(params).promise();
}));

console.log(result);

您的选项有点取决于属性别名是否为主键。仅仅知道这种差异就会有很大帮助。

Promise.all() 对每个别名执行一个操作。考虑批处理方法。单个批处理在一次 API 调用中执行,这将减少操作次数并减少 DynamoDB API 调用。批处理很有趣。

当属性键'alias'为主键时,BatchGetItem a 是非常高效的操作,最多可执行十几个操作,其中每个操作都是对一个别名的查询。只需为数组中的每个条目创建一个包含一个操作的 BatchGetItem。响应是单个 json 字典。

当属性键 'alias' 不是主键时则不同,因为必须扫描 table。一个 DynamoDB scan() is different than a DynamoDB query()。 scan 可以按任何属性查找项目,并且可以按 'alias.' 的值进行过滤 FilterExpression 支持 OR 并且可以过滤扫描。扫描将检查每个项目,过滤器只是减少返回的结果集。响应是单个 json 字典。