Node.js 查询/扫描DynamoDB-NodeJS的结果不一致

Node.js 查询/扫描DynamoDB-NodeJS的结果不一致,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,我有一个DynamoDB表,看起来像这样: (像这样的条目有1500000个,具有不同的时间戳) 我有两个GSI: 我正在尝试检索给定日期表中的所有行 这就是我的代码(NodeJS)的样子: 它似乎起作用了,但我得到的结果比预期的要少。同样的代码在较小的表上运行良好 与“扫描”结果相似 我遗漏了什么?这是因为默认情况下,DynamoDB一次只返回1mb的数据,但是有一种方法可以解决这个问题 您需要像下面这样更改您的实现 第1步:调用DyanmoDB表,它将返回前1mb的数据,然后返回“下一个

我有一个DynamoDB表,看起来像这样:

(像这样的条目有1500000个,具有不同的时间戳)

我有两个GSI:

我正在尝试检索给定日期表中的所有行

这就是我的代码(NodeJS)的样子:

它似乎起作用了,但我得到的结果比预期的要少。同样的代码在较小的表上运行良好

与“扫描”结果相似


我遗漏了什么?

这是因为默认情况下,DynamoDB一次只返回1mb的数据,但是有一种方法可以解决这个问题

您需要像下面这样更改您的实现

第1步:调用DyanmoDB表,它将返回前1mb的数据,然后返回
“下一个评估键”

第2步:再次调用Dynamodb表,但这次您在
“独占启动键”
中传递
“下一个评估键”
,以获取新的数据集

步骤3:检查
“下一个评估键”
是否仍然可用,然后重复步骤2,否则您将获得该键的所有数据

以下是参考资料:


希望这有助于

根据每条记录的大小,检索到的记录数将发生变化,因为DynamoDB对查询有大小限制(1MB)

在DynamoDB中,查询只返回1MB的数据。 但我们可以对结果进行分页。它可能会解决你的问题。 如果未完全检索满足该查询的数据,则查询返回的数据将包含“LastEvaluatedKey”。因此,我们必须将“LastEvaluatedKey”设置为“ExclusiveStartKey”。然后查询将检索剩余的数据。通过递归地遵循这个方法,我们将得到完整的数据

var data = [];
async.until(function () {
  return scanComplete;
},
  function (callback) {
    docClient.query(params, function (err, result) {
      if (err) {
        console.log(err);
      } else {
        data.push(result.Items);
        if (typeof (result.LastEvaluatedKey) === 'undefined') {
          scanComplete = true;
          //fully retrieved
        } else {
          params.ExclusiveStartKey = result.LastEvaluatedKey;
        }
        if (!scanComplete) {
        }
      }
      callback(err);
    });
  },
  // this runs when the loop is complete or returns an error
  function (err) {
    if (err) {
      console.log('error in processing scan ');
      console.log(err);
      reject(err);
    } else {
      resolve(data);
    }
  });
var data = [];
async.until(function () {
  return scanComplete;
},
  function (callback) {
    docClient.query(params, function (err, result) {
      if (err) {
        console.log(err);
      } else {
        data.push(result.Items);
        if (typeof (result.LastEvaluatedKey) === 'undefined') {
          scanComplete = true;
          //fully retrieved
        } else {
          params.ExclusiveStartKey = result.LastEvaluatedKey;
        }
        if (!scanComplete) {
        }
      }
      callback(err);
    });
  },
  // this runs when the loop is complete or returns an error
  function (err) {
    if (err) {
      console.log('error in processing scan ');
      console.log(err);
      reject(err);
    } else {
      resolve(data);
    }
  });