为什么使用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