我已经通读了AWS关于分页的文档:
根据他们的文件规定:
在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果发出限制值为6且没有筛选器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或者在没有筛选器的扫描情况下仅返回前六项)
这意味着,给定我有一个名为问题
的表,其属性称为难度
(可以接受从0
到2
的任何数值),我可能会遇到以下难题:
GET/questions?难度=0
然后如何根据查询正确分页?我可以得到我想要的结果,同时得到正确的偏移量
避免使用递归来防止调用堆栈溢出。扩展@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
}
下面是一个例子,说明如何在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();
}
}
});
使用异步/等待。
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。(名称:电子邮件,类型