Выражение фильтра Dynamodb не возвращает все результаты - PullRequest
0 голосов
/ 21 октября 2018

Я хочу отсканировать все элементы за последние 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) => {
  // ... 
}

1 Ответ

0 голосов
/ 21 октября 2018

Это потому, что на 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
            }
        }
    }
}; 
...