一尘不染

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

node.js

我需要在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的定义:

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

在上面的代码中,如果删除该Limit参数,DynamoDB将返回与过滤器要求匹配的项目。因此,条件还可以。但是当我用Limit参数扫描时,结果为空。

XXXX表有5个项目。只有2首具有该Removed属性。当我不带Limit参数扫描时,DynamoDB返回3个不带Removed属性的项目。

我做错了什么?


阅读 464

收藏
2020-07-07

共1个答案

一尘不染

从您引用的文档中:

如果还提供FilterExpression值,则DynamoDB将返回 前六项 中也符合过滤器要求的项目

通过组合Limit和FilterExpression,您已经告诉DynamoDB仅查看表中的前两个项目,并针对这些项目评估FilterExpression。DynamoDB中的限制可能会引起混淆,因为它的工作原理与limitRDBMS中的SQL表达式不同。

2020-07-07