DynamoDb扫描返回本地但不是实时的所有数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDb扫描返回本地但不是实时的所有数据相关的知识,希望对你有一定的参考价值。

我使用递归调用来获取来自dynamodb的数据超过1 mb的数据

params.ConsistentRead = true;
  let projectCollection = [];
  dynamoDb.scan(params, onQuery);
  function onQuery(err, data) {
      const methodName = 'onQuery';
      if (err) {
          callback(err);
      } else {
          for (let i = 0; i < data.Items.length; i++) {
              projectCollection.push(data.Items[i]);
          }
          if (typeof data.LastEvaluatedKey !== 'undefined') {
              params.ExclusiveStartKey = data.LastEvaluatedKey;
              dynamoDb.scan(params, onQuery);

          } else {        
              callback(err, projectCollection); //recursive call
          }
      }
  }
};

但我得到了我的本地主机上的数据但是一旦我在aws上部署它,其中调用通过管道API GATEWAY然后lambda然后是dynamodb,我的函数不返回所有数据而是一小块。

它是Cache问题吗?

答案

可能,但我认为您更有可能不按预期分页扫描结果。我认为最可能的解释是你只阅读第一页。

我不是nodejs人,但我注意到你使用的是严格的操作数:

typeof data.LastEvaluatedKey !== 'undefined'

你似乎正在对一个字符串应用测试,我认为该字符串将始终返回true。公平地说,我不认为这是你的根本问题,但你应该使用..?

typeof data.LastEvaluatedKey != 'undefined'
另一答案

我使用了QUERY,并根据需要更快地提供数据。

let items = [];
  let queryExecute = function(callback) {
      dynamoDb.query(params,function(err,result) {
          if(err) {
              callback(err);
              } else {
              items = items.concat(result.Items);
              if(result.LastEvaluatedKey) {
                  params.ExclusiveStartKey = result.LastEvaluatedKey;
                  queryExecute(callback);
                  } else {         
                      callback(err,items);
                  }
              }
          });
      };

以上是关于DynamoDb扫描返回本地但不是实时的所有数据的主要内容,如果未能解决你的问题,请参考以下文章

对DynamoDB数据进行排序

使用 lambda 扫描/查询 dynamodb 表中的特定条目

如何使用 nodejs 使用 Dynamodb 并行扫描检索数据

AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API

我们可以避免在 dynamodb 中进行扫描吗

如何使用 node.js 从`AWS dynamodb` 获取/扫描所有项目