过滤后如何进行DynamoDB限制?

Woo*_*Kim 4 node.js amazon-dynamodb

我想用以下逻辑实现DynamoDB Scan:

扫描 - >过滤(布尔值为true或false) - >限制(用于分页)

但是,我只能用这个逻辑实现Scan:

扫描 - >限制(用于分页) - >过滤(布尔值为true或false)

我怎样才能做到这一点?

下面是我编写的实现第二个扫描逻辑的示例:

    var parameters = {
        TableName: this.tableName,
        Limit: queryStatement.limit
    };
    if ('role' in queryStatement) {
        parameters.FilterExpression = '#role = :role';
        parameters.ExpressionAttributeNames = {
            '#role': 'role'
        };
        parameters.ExpressionAttributeValues = {
            ':role': queryStatement.role
        };
    }
    if ('startKey' in queryStatement) {
        parameters.ExclusiveStartKey = { id: queryStatement.startKey};
    }

    this.documentClient.scan(parameters, (errorResult, result) => {
        if (errorResult) {
            errorResult._status = 500;
            return reject(errorResult);
        }

        return resolve(result);
    });
Run Code Online (Sandbox Code Playgroud)

这个代码就像第二个一样.

扫描 - >限制 - >过滤

not*_*est 5

该DynamoDB LIMIT工作方式下面提到(在您的文章即第二种方法)设计.由于它的设计工作,没有解决方案.

LastEvaluatedKey应该用于获取后续扫描的数据.

扫描 - >限制(用于分页) - >过滤(布尔值为true或false)

在请求中,将Limit参数设置为您希望DynamoDB在返回结果之前处理的项目数.

在响应中,DynamoDB返回Limit值范围内的所有匹配结果.例如,如果发出限制值为6且没有过滤器表达式的查询或扫描请求,DynamoDB将返回表中与请求中指定的键条件匹配的前六项(或仅返回前六项)扫描没有过滤器的情况).如果还提供FilterExpression值,DynamoDB将返回前六个中与过滤器要求匹配的项目(返回的结果数将小于或等于6).

对于查询或扫描操作,如果操作未返回表中的所有匹配项,DynamoDB可能会返回LastEvaluatedKey值.要获取匹配项的完整计数,请从上一个请求中获取LastEvaluatedKey值,并将其用作下一个请求中的ExclusiveStartKey值.重复此操作,直到DynamoDB不再返回LastEvaluatedKey值.

  • 哦,你的意思是,没有办法解决这个问题(?)对吧?因为这就是 DynamoDB 的意图。我使用 LastEvaluatedKey 进行分页,例如 http://blabla.com/users/?limit=10&startKey='' startKey 从 LastEvaluatedKey 获取。我想为每个 http 响应获取 10 个数据,因为我设置了 limit=10,但由于上述原因它不能? (2认同)

use*_*098 5

使用--max-items=2而不是--limit=2, max-items 将在过滤后进行限制。

示例查询max-items

aws dynamodb query --table-name=limitTest --key-condition-expression="gsikey=:hash AND gsisort>=:sort"  --expression-attribute-values  '{ ":hash":{"S":"1"},    ":sort":{"S":"1"}, ":levels":{"N":"10"}}'   --filter-expression="levels >= :levels"  --scan-index-forward  --max-items=2  --projection-expression "levels,key1" --index-name=gsikey-gsisort-index
Run Code Online (Sandbox Code Playgroud)

示例查询limit

aws dynamodb query --table-name=limitTest --key-condition-expression="gsikey=:hash AND gsisort>=:sort"  --expression-attribute-values  '{ ":hash":{"S":"1"},    ":sort":{"S":"1"}, ":levels":{"N":"10"}}'   --filter-expression="levels >= :levels"  --scan-index-forward  --limit=2  --projection-expression "levels,key1" --index-name=gsikey-gsisort-index
Run Code Online (Sandbox Code Playgroud)

  • DynamoDB SDK 支持这个吗? (4认同)