Dynamodb过滤器表达式未返回所有结果

时间:2018-10-21 12:46:40

标签: javascript node.js nosql amazon-dynamodb

我想扫描最近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 :(得分:2)

这是因为dynamoDb在SCAN operation上只会发送data upto 1mb only。如果您想要的记录大小超过1mb,则会自动进行分页。

如果您记录结果,那么您将发现一个名为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
            }
        }
    }
};