为什么使用Limit和FilterExpression进行DynamoDB扫描不会返回符合filter要求的项目?
我需要在DynamoDB上进行限制和条件扫描。
文档说:
在响应中,DynamoDB会返回Limit值范围内的所有匹配结果。 例如,如果发出限制值为6且没有filterexpression式的查询或扫描请求,DynamoDB会返回表中与请求中指定的关键条件相匹配的前六个项目(或者仅返回前六个项目在没有filter的情况下扫描)。 如果您还提供FilterExpression值,则DynamoDB将返回前六个中也与filter要求匹配的项目(返回的结果数小于或等于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定义:
- 主分区键:用户(数字)
- 主sorting键:标识符(string)
- 指数:
- 索引名称:RemovedIndex
- types:GSI
- 分区键:已删除(数字)
- sorting键: –
- 属性:ALL
在上面的代码中,如果我删除了Limit
参数,那么DynamoDB将返回符合filter要求的项目。 所以,条件是好的。 但是当我用Limit
参数扫描时,结果是空的。
XXXX表有5个项目。 只有2个第一个具有Removed
属性。 当我没有Limit
参数扫描时,DynamoDB返回3个没有Removed
属性的项目。
我做错了什么?
从你引用的文档中:
如果您还提供了FilterExpression值,则DynamoDB将返回前六个中也与筛选器要求相匹配的项目
通过组合Limit和FilterExpression,您已经告诉DynamoDB只查看表中的前两项,并针对这些项目评估FilterExpression。 DynamoDB中的限制可能会引起混淆,因为它与RDBMS中SQLexpression式的limit
不同。
也遇到这个问题,我想你只需要扫描整个表到1 MB的最大值
扫描扫描结果集限制为每个电话1 MB。 您可以使用扫描响应中的LastEvaluatedKey
来检索更多结果。
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html