如何在NodeJS中使用dynamoDB使用搜索条件来获取数据并进行限制?

时间:2019-03-09 10:49:09

标签: node.js amazon-dynamodb

我想应用一个引导程序表,以进行分页排序和过滤, 分页已完成,但是当我当时进行过滤时,仅从限制定义为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)数据库一样,那么我该如何应用查询

谢谢你进步

1 个答案:

答案 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

在对客户端的响应中对搜索上下文进行编码/加密/混淆可能是一个好主意。