Query () DynamoDB для каждого значения в массиве на лямбда NodeJS - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть следующий код в NodeJS 12x лямбда-функции:

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, как и ожидалось, но мне нужно выполнить это n раз для каждый элемент в массиве targetedAliases.

Можно ли использовать Array.forEach или что-то подобное для повторного выполнения запроса / сканирования для каждого элемента в массиве? Или же я могу использовать массив в FilterExpression для выполнения запроса / сканирования только один раз?

Я хочу сохранить каждый результат запроса / сканирования в переменной aliasScores как объединение всех возвращаемых объектов для использования это далее ниже.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Вы можете использовать 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);
1 голос
/ 28 февраля 2020

Ваши параметры зависят от того, является ли псевдоним атрибута первичным ключом или нет. Просто знание этой разницы очень поможет.

Promise.all () выполняет одну операцию для каждого псевдонима. Рассмотрим пакетный подход. Один пакет выполняется для одного вызова API, что сократит количество операций и уменьшит количество вызовов API DynamoDB. Пакетирование - это весело.

Когда ключ атрибута 'alias' является первичным ключом, BatchGetItem a является очень эффективной операцией для примерно дюжины или около того операций, где каждая операция является запросом для одного псевдонима. Просто создайте один BatchGetItem с одной операцией для каждой записи в массиве. Ответом является один json словарь.

Если ключ атрибута 'alias' не является первичным ключом, тогда он отличается, поскольку таблицу необходимо сканировать. DynamoDB scan () отличается от DynamoDB query (). Сканирование может найти элементы по любому атрибуту и ​​отфильтровать по значению «псевдоним». FilterExpression поддерживает ИЛИ и можно фильтровать сканирование. Сканирование проверит каждый элемент, а фильтр просто уменьшит возвращаемый набор результатов. Ответом является один json словарь.

...