在我的一个python应用程序中,我正在使用boto,我想仅使用范围键查询dynamodb表。我不想使用扫描。
评分表的架构
ratings = Table.create('ratings', schema=[
HashKey('user_id', data_type=NUMBER),
RangeKey('photo_id', data_type=NUMBER)
], throughput={
'read': 5,
'write': 15,
}, indexes = [
AllIndex('rating_allindex', parts=[
HashKey('user_id', data_type=NUMBER),
RangeKey('photo_id', data_type=NUMBER)
])
])
from boto.dynamodb2.table import Table
ratings = Table('ratings')
# photo_id is range_key and user_id is hash_key
ratings_list = ratings.query(photo_id__eq=1)
这样做,我收到此错误Query condition missed key schema element user_id
。
再一次,我想我可以给我的hash_key
ratings_list = ratings.query(user_id__gte=1, photo_id__eq=1)
但它显示错误Query key condition not supported
。我想只有hash_key允许使用过滤器__eq。我如何实现我的目标?
答案 0 :(得分:7)
在DynamoDB上使用Query操作时,您必须提供一个哈希键,它不会被定义为range_key_conditions的一部分,因为您可以在文档中看到 - 所以您必须使用你已经想到的user_id_eq。
如果您需要在一次API调用中从多个哈希键中获取行,则必须使用“扫描”(您可以使用batchGet获取多行,但这与您的方案无关)
P.s,看来您的二级索引与Range键相同,那是一个错误吗?
答案 1 :(得分:3)
您可以使用global secondary index作为哈希键来实现您想要的行为。
答案 2 :(得分:2)
在AWS SDKv2中,您可以使用AWSDynamoDBScanExpression扫描表格,例如。 iOS的:
AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];
scanExpression.exclusiveStartKey = nil;
scanExpression.limit = @20;
[[[dynamoDBObjectMapper scan:[DDBTableRow class]
expression:scanExpression]
continueWithExecutor:[BFExecutor mainThreadExecutor] withSuccessBlock:^id(BFTask *task) {...}
如果您需要条件,可以使用AWSDynamoDBCondition:
AWSDynamoDBCondition *condition = [AWSDynamoDBCondition new];
AWSDynamoDBAttributeValue *attribute = [AWSDynamoDBAttributeValue new];
attribute.N = @"400";
condition.attributeValueList = @[attribute];
condition.comparisonOperator = AWSDynamoDBComparisonOperatorEQ;
scanExpression.scanFilter = @{@"latitude": condition};