Dynamodb:使用两个以上的属性进行查询

Jua*_*blo 7 python boto amazon-web-services nosql amazon-dynamodb

在Dynamodb中,您需要在索引中指定可用于进行查询的属性.

如何使用两个以上的属性进行查询?

使用boto的示例.

Table.create('users', 
        schema=[
            HashKey('id') # defaults to STRING data_type
        ], throughput={
            'read': 5,
            'write': 15,
        }, global_indexes=[
            GlobalAllIndex('FirstnameTimeIndex', parts=[
                HashKey('first_name'),
                RangeKey('creation_date', data_type=NUMBER),
            ],
            throughput={
                'read': 1,
                'write': 1,
            }),
            GlobalAllIndex('LastnameTimeIndex', parts=[
                HashKey('last_name'),
                RangeKey('creation_date', data_type=NUMBER),
            ],
            throughput={
                'read': 1,
                'write': 1,
            })
        ],
        connection=conn)
Run Code Online (Sandbox Code Playgroud)

如何查找姓名为"John",姓氏为"Doe"并使用boto在"3-21-2015"创建的用户?

bsd*_*bsd 8

您的数据建模过程必须考虑您的数据检索要求,在DynamoDB中您只能通过散列或散列+范围键进行查询.

如果按主键查询不足以满足您的要求,则可以通过创建二级索引(本地或全局)来获得备用密钥.

但是,多个属性的串联可以在某些方案中用作主键,以避免维护二级索引的成本.

如果您需要按名字,姓氏和创建日期获取用户,我建议您在哈希和范围键中包含这些属性,因此不需要创建其他索引.

哈希键应包含可由应用程序计算的值,同时提供统一的数据访问.例如,假设您选择按如下方式定义密钥:

哈希键(名称):first_name#last_name

范围键(已创建):MM-DD-YYYY-HH-mm-SS毫秒

您可以随时添加其他属性,以防所提到的属性不足以使您的密钥在表中唯一.

users = Table.create('users', schema=[
        HashKey('name'),
        RangeKey('created'),
     ], throughput={
        'read': 5,
        'write': 15,
     })
Run Code Online (Sandbox Code Playgroud)

将用户添加到表中:

with users.batch_write() as batch:
     batch.put_item(data={
         'name': 'John#Doe',
         'first_name': 'John',
         'last_name': 'Doe',
         'created': '03-21-2015-03-03-02-3243',
     })
Run Code Online (Sandbox Code Playgroud)

在'03 -21-2015'上创建的用户John Doe的代码应该类似于:

name_john_doe = users.query_2(
   name__eq='John#Doe',
   created__beginswith='03-21-2015'
)

for user in name_john_doe:
     print user['first_name']
Run Code Online (Sandbox Code Playgroud)

重要注意事项:

一世.如果您的查询开始变得太复杂,并且哈希或范围键太长,因为连接字段太多,那么绝不使用二级索引.这是一个好兆头,只有主要指标不足以满足您的要求.

II.我提到Hash Key应该提供统一的数据访问:

"Dynamo使用一致的散列来在其副本上划分其密钥空间,并确保均匀的负载分配.统一的密钥分发可以帮助我们实现统一的负载分配,假设密钥的访问分配不是高度倾斜的." [DYN]

不仅Hash Key允许唯一标识记录,而且还是确保负载分配的机制.范围键(使用时)有助于指示将主要一起检索的记录,因此,存储也可以针对此类需求进行优化.

以下链接有关于该主题的完整说明:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.UniformWorkload

  • 谢谢!,我们做到了这一点,并且工作非常好:D (2认同)