NodeJS DynamoDB客户端不满足限制

lnvxswe2  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(144)

客户端库:“@aws-sdk/客户端动态数据库”:“3.188.0”
我有一个DynamoDB分页实现。
我的用户数为98,页面大小为20。因此,我希望结果中有5个页面,每个页面有20、20、20、20和18个用户。
但实际上,我得到了超过5页,每个页面都有可变的用户数量,如10,12,11等。
我如何才能让用户与适当的页面限制,如20,20,20 & 18?

public async pagedList(usersPerPage: number, lastEvaluatedKey?: string): Promise<PagedUser> {

      const params = {
         TableName: tableName,
         Limit: usersPerPage,
         FilterExpression: '#type = :type',
         ExpressionAttributeValues: {
            ':type': { S: type },
         },
         ExpressionAttributeNames: {
            '#type': 'type',
         },
      } as ScanCommandInput;

      if (lastEvaluatedKey) {
         params.ExclusiveStartKey = { 'oid': { S: lastEvaluatedKey } };
      }

      const command = new ScanCommand(params);
      const data = await client.send(command);

      const users: User[] = [];
      if (data.Items !== undefined) {
         data.Items.forEach((item) => {
            if (item !== undefined) {
               users.push(this.makeUser(item));
            }
         });
      }

      let lastKey;
      if (data.LastEvaluatedKey !== undefined) {
         lastKey = data.LastEvaluatedKey.oid.S?.valueOf();
      }
      return {
         users: users,
         lastEvaluatedKey: lastKey
      };
   }
nhhxz33t

nhhxz33t1#

扫描命令文档https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.Pagination
提供您的结果可能包含较少结果的几个原因:

  • 结果大小必须为1 MB
  • 如果应用了筛选器,则会在“扫描后”筛选数据。您的查询中有筛选器。

从文档中
筛选器表达式在扫描完成之后但在返回结果之前应用。因此,无论是否存在筛选器表达式,扫描都会消耗相同的读取容量。
...
现在假设您向Scan添加了一个筛选表达式。在这种情况下,DynamoDB将筛选表达式应用于返回的六个项目,丢弃不匹配的项目。最终的Scan结果包含六个或更少的项目,具体取决于筛选的项目数。
在下一节中,我们将介绍如何验证这可能是您的案例:

计算结果中的项目数

除了符合条件的项目之外,扫描响应还包含以下元素:
ScannedCount-套用任何ScanFilter之前,已评估的项目数。ScannedCount值较高,但Count结果很少或没有结果,表示扫描作业效率不高。如果您未在要求中使用筛选器,ScannedCount会与Count相同。

相关问题