Выражение фильтра Dynamodb не возвращает все результаты

1

Я хочу сканировать все элементы за последние 7 дней, поэтому я создаю временную метку в течение 7 дней и фильтрую для отметки времени больше этого значения. Но это сканирование возвращает несколько результатов.

См. Следующий Javascript:

const daysBack = (days) => {
  let date = new Date();
  date.setDate(date.getDate() - days);
  return date.getTime() ; 
}


const params = {
  TableName: process.env.DYNAMODB_TABLE,
  FilterExpression: "#ts > :z",
  ExpressionAttributeNames:{
      "#ts": "timestamp"
  },
  ExpressionAttributeValues: {
      ":z": daysBack(7)
  },
};

dynamoDb.scan(params, (error, result) => {
  // ... 
}
Теги:
amazon-dynamodb
nosql

1 ответ

1
Лучший ответ

Это связано с тем, что при работе SCAN operation dynamoDb будет отправлять data upto 1mb only. Если нужные вам записи имеют размер более 1 мб, автоматически происходит разбиение на страницы.

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

Давайте посмотрим на этот пример, где данные проекта извлекаются рекурсивно, и все данные добавляются в массив, а затем отправляются.

let getFromDb = function (params, callback) {
    params.ConsistentRead = true;
    let projectCollection = [];
    dynamodbclient.scan(params, onQuery);

    function onQuery(err, data) {
        const methodName = 'onQuery';
        if (err) {
            callback(err);
            log.error(err, {
                class: className,
                func: methodName
            });
        } else {
            for (let i = constant.LENGTH_ZERO; i < data.Items.length; i++) {
                projectCollection.push(data.Items[i]);
            }
            if (typeof data.LastEvaluatedKey !== 'undefined') {
                params.ExclusiveStartKey = data.LastEvaluatedKey;
                dynamodbclient.scan(params, onQuery);
            } else {
                callback(err, projectCollection); //recursive call
            }
        }
    }
}; 
  • 0
    Можем ли мы сделать это внутри лямбда-функции, возвращающей ответ для API Gateway? Я имею в виду, он будет продолжать работать с ExclusiveStartKey ?
  • 0
    да, это просто рекурсивная программа, она будет работать как норма-программа, просто мы использовали концепцию рекурсии для получения данных.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню