dynamodb索引不return所有数据

dynamodb index does not return all data

我有一个 table storedgames,其中包含 2092 个项目。

它还有一个关于 table 的索引,其中还列出了 2092 个项目。

当我获取数据时,我使用索引来获取一个特定用户的项目。

const params = {
  TableName: "storedgames",
  IndexName: "user-index",
  KeyConditionExpression: "#usr = :usr",
  ExpressionAttributeNames: { "#usr": "user" },
  ExpressionAttributeValues: { ":usr": user }
};

const data = await new Promise((resolve, reject) => {
  docClient.query(params, (err, data) => {
    if (err) { reject(err); } else { resolve(data); }
  });
}).catch((err) => {
  console.error(err);
  return false;
});

但是,上面的代码并没有return所有项目。它只找到 42 个。对于今天的项目,只有 1 个命中。当我直接在 AWS 网页上查看时,我实际上找到了今天的更多项目。

即使我使用索引执行此操作,它也会找到更多记录。

当我不考虑当天的筛选时,我实际上找到了 130 多个项目, 而我的 javascript 代码只有 returns 42 项,当我忽略了日期过滤器时。


所以我的问题是,为什么当我以编程方式调用它时,我的索引数据似乎不完整?

这些记录实际上包含很多数据,而且每次查询可以获取的数据量似乎有限制。

A single Query operation can retrieve a maximum of 1 MB of data. This limit applies before any FilterExpression is applied to the results. If LastEvaluatedKey is present in the response and is non-null, you must paginate the result set (see Paginating the Results).

因此,我的一个可能解决方案是执行多次提取,直到您拥有整个集合。

const queryAllItems = (params, callback) => {
  let fullResult = { Items: [], Count: 0, ScannedCount: 0 };

  const queryExecute = (callback) => {
    docClient.query(params, (err, result) => {
      if (err) {
        callback(err);
        return;
      }

      const { Items, LastEvaluatedKey, Count, ScannedCount } = result;

      fullResult.Items = [...fullResult.Items, ...Items];
      fullResult.Count += Count;
      fullResult.ScannedCount += ScannedCount;

      if (!LastEvaluatedKey) {
        callback(null, fullResult);
        return;
      }

      params.ExclusiveStartKey = LastEvaluatedKey;
      queryExecute(callback);
    });
  }

  queryExecute(callback);
}

遗憾的是,这不是一个完整的解决方案。在我的情况下,仅查询 130 项(需要 4 次实际提取)大约需要 15 秒。