为什么使用Limit和FilterExpression扫描DynamoDB不会返回符合过滤器要求的项目?

Gab*_*nha 9 amazon-web-services node.js amazon-dynamodb

我需要在DynamoDB上进行限制扫描和条件扫描.

文件说:

在响应中,DynamoDB返回Limit值范围内的所有匹配结果.例如,如果发出限制值为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);
    }
});
Run Code Online (Sandbox Code Playgroud)



表XXXX定义:

  • 主分区键:用户(号码)
  • 主排序键:标识符(字符串)
  • 指数:
    • 索引名称:RemovedIndex
    • 类型:GSI
    • 分区键:已删除(编号)
    • 排序键: -
    • 属性:ALL


在上面的代码中,如果我删除Limit参数,DynamoDB将返回符合过滤器要求的项目.所以,条件还可以.但是当我用Limit参数扫描时,结果是空的.

XXXX表有5个项目.只有2个第一个具有该Removed属性.当我在没有Limit参数的情况下扫描时,DynamoDB会返回没有Removed属性的3个项目.

我做错了什么?

Mar*_*k B 16

来自您引用的文档:

如果您还提供FilterExpression值,DynamoDB将返回前六个中与过滤器要求相匹配的项目

通过组合Limit和FilterExpression,您已告知DynamoDB仅查看表中的前两项,并针对这些项评估FilterExpression.DynamoDB中的限制可能会令人困惑,因为它与limitRDBMS中的SQL表达式的工作方式不同.

  • @Mark B但是如何在RDBMS中的SQL表达式中实现这个"限制"? (10认同)
  • @SimonPertersen 你找到答案了吗?Dynamo 的文档很糟糕。简单的事情似乎隐藏在洞里的某个地方。 (3认同)
  • @thismarcoantonio这是由于他们在dynamo中的糟糕想法,它在返回后应用过滤器 - 解决这个问题的最佳方法是使用索引 - 或者使用流将它们放在弹性搜索中并执行复杂的查询 (3认同)

小智 5

也遇到了这个问题,我猜你只需要扫描整个表到最大 1 MB

扫描 每次调用扫描的结果集限制为 1 MB。您可以使用LastEvaluatedKey扫描响应来检索更多结果。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html