我想用以下逻辑实现DynamoDB Scan:
扫描 - >过滤(布尔值为true或false) - >限制(用于分页)
但是,我只能用这个逻辑实现扫描:
扫描 - >限制(用于分页) - >过滤(布尔值为true或false)
我怎样才能做到这一点?
以下是我编写的实现第二个扫描逻辑的示例:
var parameters = {
TableName: this.tableName,
Limit: queryStatement.limit
};
if ('role' in queryStatement) {
parameters.FilterExpression = '#role = :role';
parameters.ExpressionAttributeNames = {
'#role': 'role'
};
parameters.ExpressionAttributeValues = {
':role': queryStatement.role
};
}
if ('startKey' in queryStatement) {
parameters.ExclusiveStartKey = { id: queryStatement.startKey};
}
this.documentClient.scan(parameters, (errorResult, result) => {
if (errorResult) {
errorResult._status = 500;
return reject(errorResult);
}
return resolve(result);
});
此代码与第二个代码类似。
扫描 - >限制 - >过滤
答案 0 :(得分:5)
DynamoDB LIMIT的工作方式如下所述(即帖子中的第二种方法)按设计。由于它的设计工作,没有解决方案。
LastEvaluatedKey应该用于在后续扫描中获取数据。
扫描 - >限制(用于分页) - >过滤(布尔值为true或false)
在请求中,将Limit参数设置为您的项目数 希望DynamoDB在返回结果之前进行处理。
在响应中,DynamoDB返回所有匹配的结果 极限值的范围。例如,如果您发出查询或扫描 请求限制值为6且没有过滤器表达式, DynamoDB返回表中与之匹配的前六项 请求中指定的关键条件(或仅前六项) 在没有过滤器的扫描的情况下)。如果你还提供一个 FilterExpression值,DynamoDB将返回第一个项目 六,也符合过滤要求(结果数量 返回将小于或等于6)。
对于查询或扫描操作,DynamoDB可能会返回一个 如果操作未返回所有匹配,则LastEvaluatedKey值 表中的项目。要获得匹配的项目的完整计数,请执行 来自上一个请求的LastEvaluatedKey值并将其用作 下一个请求中的ExclusiveStartKey值。重复这个,直到 DynamoDB不再返回LastEvaluatedKey值。
答案 1 :(得分:1)
使用--max-items=2
代替--limit=2
,max-items将在过滤后进行限制。
使用max-items
进行示例查询:
aws dynamodb query --table-name=limitTest --key-condition-expression="gsikey=:hash AND gsisort>=:sort" --expression-attribute-values '{ ":hash":{"S":"1"}, ":sort":{"S":"1"}, ":levels":{"N":"10"}}' --filter-expression="levels >= :levels" --scan-index-forward --max-items=2 --projection-expression "levels,key1" --index-name=gsikey-gsisort-index
使用limit
进行示例查询:
aws dynamodb query --table-name=limitTest --key-condition-expression="gsikey=:hash AND gsisort>=:sort" --expression-attribute-values '{ ":hash":{"S":"1"}, ":sort":{"S":"1"}, ":levels":{"N":"10"}}' --filter-expression="levels >= :levels" --scan-index-forward --limit=2 --projection-expression "levels,key1" --index-name=gsikey-gsisort-index
答案 2 :(得分:0)
limts现在添加到dynamodb
var params = {
TableName: "message",
IndexName: "thread_id-timestamp-index",
KeyConditionExpression: "#mid = :mid",
ExpressionAttributeNames: {
"#mid": "thread_id"
},
ExpressionAttributeValues: {
":mid": payload.thread_id
},
Limit: (3 , 2 ,3),
LastEvaluatedKey: 1,
ScanIndexForward: false
};
req.dynamo.query(params, function (err, data) {
console.log(err, data);
})
答案 3 :(得分:0)
如果只有一个分页感兴趣的字段,则可以创建一个以该字段为键的索引。然后,您无需递归限制中的项目数。