过滤后如何进行DynamoDB限制?

时间:2016-10-19 18:02:23

标签: node.js amazon-dynamodb

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

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

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

扫描 - >限制(用于分页) - >过滤(布尔值为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);
    });

此代码与第二个代码类似。

扫描 - >限制 - >过滤

4 个答案:

答案 0 :(得分:5)

DynamoDB LIMIT的工作方式如下所述(即帖子中的第二种方法)按设计。由于它的设计工作,没有解决方案。

LastEvaluatedKey应该用于在后续扫描中获取数据。

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

  

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

     

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

     

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

答案 1 :(得分:1)

使用--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

使用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

答案 2 :(得分:0)

limts现在添加到dynamodb

var params = {
        TableName: "message",
        IndexName: "thread_id-timestamp-index",
        KeyConditionExpression: "#mid = :mid",
        ExpressionAttributeNames: {
            "#mid": "thread_id"
        },
        ExpressionAttributeValues: {
            ":mid": payload.thread_id
        },
        Limit:  (3 , 2 ,3),
        LastEvaluatedKey: 1,
        ScanIndexForward: false
    };
    req.dynamo.query(params, function (err, data) {
console.log(err, data);
})

答案 3 :(得分:0)

如果只有一个分页感兴趣的字段,则可以创建一个以该字段为键的索引。然后,您无需递归限制中的项目数。