boto dynamodb2:我可以只使用范围键查询表吗?

时间:2013-12-08 06:10:40

标签: python boto amazon-dynamodb

在我的一个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。我如何实现我的目标?

3 个答案:

答案 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};