当前位置: 首页 > 知识库问答 >
问题:

使用Node.js在DynamoDB中分页?

富辰阳
2023-03-14

我已经通读了AWS关于分页的文档:

根据他们的文件规定:

在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或者在没有筛选器的扫描情况下仅返回前六项)

这意味着,给定我有一个名为问题的表,其属性称为难度(可以接受从02的任何数值),我可能会遇到以下难题:

  • 客户提出请求,思考GET/questions?难度=0

然后如何根据查询正确分页?我可以得到我想要的结果,同时得到正确的偏移量


共有3个答案

李奕
2023-03-14

避免使用递归来防止调用堆栈溢出。扩展@Roshan Khandelwal方法的迭代解决方案

const getAllData = async (params) => {
  const _getAllData = async (params, startKey) => {
    if (startKey) {
      params.ExclusiveStartKey = startKey
    }
    return this.documentClient.query(params).promise()
  }
  let lastEvaluatedKey = null
  let rows = []
  do {
    const result = await _getAllData(params, lastEvaluatedKey)
    rows = rows.concat(result.Items)
    lastEvaluatedKey = result.LastEvaluatedKey
  } while (lastEvaluatedKey)
  return rows
}
黎阳冰
2023-03-14

下面是一个例子,说明如何在Node.js.中迭代DynamoDB扫描(也可以很容易地适应查询)的分页结果集

您可以保存LastEvaluatedKey状态服务器端,并将标识符传递回客户端,客户端将在下一个请求中发送该标识符,服务器将在下一个请求中将该值作为ExclusiveStartKey传递给DynamoDB。

const AWS = require('aws-sdk');
AWS.config.logger = console;

const dynamodb = new AWS.DynamoDB({ apiVersion: '2012-08-10' });

let val = 'some value';

let params = {
  TableName: "MyTable",
  ExpressionAttributeValues: {
    ':val': {
      S: val,
    },
  },
  Limit: 1000,
  FilterExpression: 'MyAttribute = :val',
  // ExclusiveStartKey: thisUsersScans[someRequestParamScanID]
};

dynamodb.scan(scanParams, function scanUntilDone(err, data) {
  if (err) {
    console.log(err, err.stack);
  } else {
    // do something with data

    if (data.LastEvaluatedKey) {
      params.ExclusiveStartKey = data.LastEvaluatedKey;

      dynamodb.scan(params, scanUntilDone);
    } else {
      // all results scanned. done!
      someCallback();
    }
  }
});
邓星光
2023-03-14

使用异步/等待。

const getAllData = async (params) => { 

    console.log("Querying Table");
    let data = await docClient.query(params).promise();

    if(data['Items'].length > 0) {
        allData = [...allData, ...data['Items']];
    }

    if (data.LastEvaluatedKey) {
        params.ExclusiveStartKey = data.LastEvaluatedKey;
        return await getAllData(params);

    } else {
        return data;
    }
}

我使用全局变量allData收集所有的数据。

调用此函数包含在一个尝试捕获中

try {

        await getAllData(params);
        console.log("Processing Completed");

        // console.log(allData);

    } catch(error) {
        console.log(error);
    }

我在Lambda中使用它,效果很好。

这篇文章真的帮助和指导了我。谢谢

 类似资料:
  • 问题内容: 在我的项目中,我需要使用分页查询数据库,并为用户提供基于当前搜索结果进行查询的功能。像极限之类的东西,我找不到与Node.js一起使用的东西。我的后端是mysql,我正在编写rest api。 问题答案: 您可以尝试类似的操作(假设您使用Express 4.x)。 使用GET参数(此处的page是所需的页面结果数,而npp是每页的结果数)。 在此示例中,查询结果设置在响应有效负载的字段

  • 我们正在使用boto3为我们的DynamoDB,我们需要做一个完整的扫描我们的表,以便能够做到这一点,基于其他帖子,我们需要做一个分页。但是,我们无法找到分页的工作示例。这是我们所做的。 我们不知道如何将esk作为下一个查询的ExclusiveStartKey。ExclusiveStartkey参数的预期值应该是多少?我们在DynamoDB还是新手,还有很多东西需要学习,包括这个。谢谢

  • 我目前正在使用JS AWS-SDK的executeStatement使用PartiQL在DynamoDB中进行分页,但我返回的对象不包含用于分页的NextToken(仅项目数组)。这就是代码的样子(非常简单): 我想知道是否有人使用DynamoDB的PartiQL处理分页。 这可能是因为我的分区键是字符串类型吗? 还在努力弄清楚。 谢谢,提前!

  • 有人知道从表中分页记录吗。实际上,我想用DynamoDb在php中创建一个分页组件。 它似乎是不可能给分页喜欢 因为Dyanmodb只提供了LIMIT子句,通过它我们可以读取一定数量的记录,并且可以通过LastEvaluatedKey处理接下来的n条记录。所以如果我想直接跳到第五页,怎么可能呢? 据我所知,我们不能在页码中显示页码。我们可以做的就是读取一定数量的记录,并提供下一个链接来检索下一个n

  • 有人尝试在Apache Flink中使用DynamoDB流吗? Flink有一个Kinesis消费者。但是我正在寻找如何直接使用Dynamo流。 我试了很多次,但什么也没找到。然而,Flink Jira董事会发现一个未决请求。所以我想这个选项还不可用?我有什么选择? 允许FlinkKinesisConsumer适应AWS DynamoDB流

  • 我正在使用AWS控制台和NodeJS。 我有一个带有分区键(user\u id)和排序键(company\u id)以及其他属性的dynamodb用户表。 我的一个属性是用户的电子邮件。电子邮件是唯一属性。 我需要通过电子邮件user_id,但我没有他的user_id和company_id。 我认为我应该使用全球二级指数。 我点击了用户表,打开索引选项卡并为该表创建了GSI。(名称:电子邮件,类型