在AWS DynamoDb上查询Range键的最大值

时间:2014-08-23 02:07:56

标签: boto amazon-dynamodb

什么是DynamoDB等效于

SELECT MAX(RANGE_KEY) FROM MYTABLE WHERE PRIMARYKEY = "value"

我能想到的最好的是

from boto.dynamodb2.table import Table as awsTable

tb = awsTable("MYTABLE")
rs = list(tb.query_2(PRIMARYKEY__eq="value", reverse=True, limit=1))
MAXVALUE = rs[0][RANGE_KEY]

有更好的方法吗?

3 个答案:

答案 0 :(得分:11)

这是正确的方法。

因为哈希键匹配的记录按范围键排序,所以按照后代顺序获取第一个记录将为您提供具有最大范围键的记录。

  

查询结果始终按范围键排序。如果是数据类型   范围键是Number,结果以数字顺序返回;   否则,结果按ASCII字符代码的顺序返回   值。默认情况下,排序顺序为升序。扭转秩序   使用ScanIndexForward参数设置为false。

查询和扫描操作 - Amazon DynamoDB:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html

注意:通过boto API将reverse参数设置为true等同于通过本机AWS API将ScanIndexForward设置为false。

答案 1 :(得分:3)

如果有人正在研究如何使用Java:

QuerySpec querySpec = new QuerySpec();
        querySpec.withKeyConditionExpression("PRIMARYKEY = :key")
                .withValueMap(new ValueMap()
                        .withString(":key", primaryKeyValue));
        querySpec.withScanIndexForward(true); 
        querySpec.withMaxResultSize(1);

答案 2 :(得分:0)

在boto3中,您可以这样操作:

import boto3
from boto3.dynamodb.conditions import Key, Attr

kce = Key('table_id').eq(tableId) & Key('range').between(start, end)
output = table.query(KeyConditionExpression = kce, ScanIndexForward = False, Limit = 1) 

输出包含与在开始和结束之间的范围的“最大值”关联的行。对于最小值,将ScanIndexForward更改为True