我需要在DynamoDB上进行限制和条件扫描。
该文件说:
在响应中,DynamoDB返回限制值范围内的所有匹配结果。例如,如果您发出的查询或扫描请求的限制值为6,并且没有过滤器表达式,则DynamoDB会返回表中与请求中指定的关键条件匹配的前六个项目(或仅返回前六个项目)。没有过滤器的扫描)。如果还提供FilterExpression值,则DynamoDB将在前六个中返回还与过滤器要求匹配的项目(返回的结果数将小于或等于6)。
代码(NODEJS):
var params = { ExpressionAttributeNames: {"#user": "User"}, ExpressionAttributeValues: {":user": parseInt(user.id)}, FilterExpression: "#user = :user and attribute_not_exists(Removed)", Limit: 2, TableName: "XXXX" }; DynamoDB.scan(params, function(err, data) { if (err) { dataToSend.message = "Unable to query. Error: " + err.message; } else if (data.Items.length == 0) { dataToSend.message = "No results were found."; } else { dataToSend.data = data.Items; console.log(dataToSend); } });
表XXXX的定义:
在上面的代码中,如果删除该Limit参数,DynamoDB将返回与过滤器要求匹配的项目。因此,条件还可以。但是当我用Limit参数扫描时,结果为空。
Limit
XXXX表有5个项目。只有2首具有该Removed属性。当我不带Limit参数扫描时,DynamoDB返回3个不带Removed属性的项目。
Removed
我做错了什么?
从您引用的文档中:
如果还提供FilterExpression值,则DynamoDB将返回 前六项 中也符合过滤器要求的项目
通过组合Limit和FilterExpression,您已经告诉DynamoDB仅查看表中的前两个项目,并针对这些项目评估FilterExpression。DynamoDB中的限制可能会引起混淆,因为它的工作原理与limitRDBMS中的SQL表达式不同。
limit