我想应用一个引导程序表,以进行分页排序和过滤, 分页已完成,但是当我当时进行过滤时,仅从限制定义为LIMIT的有限数据中找到的数据,因此如何像MySql(限制,偏移量)一样在Dynamodb上应用分页排序和过滤查询。
当前查询:-
var params = {
TableName: tableName,
KeyConditionExpression: (req.body.search.length == 0) ? null : " #emailid = :search_Query",
FilterExpression : (req.body.search.length == 0) ? null : " contains (#name , :search_Query) OR contains (#lastName , :search_Query) ",
ExpressionAttributeNames: (req.body.search.length == 0) ? null : {
"#name": "name",
"#lastName": "lastName",
},
ExpressionAttributeValues: (req.body.search.length == 0) ? null : {
":search_Query" : req.body.search
},
Limit : req.body.limit ,
ExclusiveStartKey: (req.body.offset == 0) ? null : {emailid : req.body.emailid } ,
};
var lastData=[];
docClient.scan(params, function scanUntilDone(err, data) {
});
当前行为 如果通过限制5,仅从定义的限制中提取数据,并且仅从五个数据中搜索数据,但是我需要从所有数据中获取五个数据,就像MySql(limit)数据库一样,那么我该如何应用查询
谢谢你进步
答案 0 :(得分:0)
您必须在响应中将搜索上下文传递给客户端。 “当前”页面的LastEvaluatedKey
以及您包含在响应中的页面上多少个结果的偏移量。客户端必须在下一个请求中包括搜索上下文。在实际的DynamoDB请求上使用更高的限制,以避免在服务器端请求上分页。
示例(客户想要整齐的页面,且结果不超过5个):
API Request 1: Limit=5
DDB Request 1: ExclusiveStartKey=null, Limit=100
DDB Response 1: Results=3, LastEvaluatedStartKey=A
DDB Request 2: ExclusiveStartKey=A, Limit=100
DDB Response 2: Results=77, LastEvaluatedStartKey=B
API Response 1: Results=[<3 results from page 1 + 2 from page 2>], SearchKey={A: 2} // the offset
API Request 2: Limit=5, SearchKey={A: 2}
DDB Request 3: ExclusiveStartKey=A, Limit=100
DDB Response 3: Results=77, LastEvaluatedStartKey=B
API Response 1: Results=[<5 results from page 2, starting at offset 2>], SearchKey={A: 7} // the new offset, same page still
在对客户端的响应中对搜索上下文进行编码/加密/混淆可能是一个好主意。