在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)
如何查找姓名为“John”,姓氏为“Doe”且使用boto在“3-21-2015”创建的用户?
答案 0 :(得分:8)
您的数据建模过程必须考虑您的数据检索要求,在DynamoDB中,您只能通过散列或散列+范围键进行查询。
如果主键查询不足以满足您的要求,您当然可以通过创建二级索引(本地或全局)来获得备用密钥。
但是,在某些情况下,可以使用多个属性的串联作为主键,以避免维护二级索引的成本。
如果您需要按名字,姓氏和创建日期获取用户,我建议您在哈希和范围键中包含这些属性,因此不需要创建其他索引。
哈希密钥应该包含一个值,该值可以由您的应用程序计算,同时提供统一的数据访问。例如,假设您选择按如下方式定义密钥:
哈希键(名称):first_name#last_name
范围键(已创建):MM-DD-YYYY-HH-mm-SS-milliseconds
您可以随时添加其他属性,以防所提到的属性不足以使您的密钥在整个表格中唯一。
users = Table.create('users', schema=[
HashKey('name'),
RangeKey('created'),
], throughput={
'read': 5,
'write': 15,
})
将用户添加到表中:
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',
})
在'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']
重要注意事项:
我。如果您的查询开始变得太复杂,并且哈希或范围键太长,因为连接字段太多,那么绝不使用二级索引。这是一个好兆头,只有主要指标不足以满足您的要求。
II。我提到哈希密钥应该提供统一数据访问:
“Dynamo使用一致的散列来划分其密钥空间 复制品并确保均匀的负荷分布。统一的钥匙 分布可以帮助我们实现均匀的负荷分配 密钥的访问分配没有高度偏差。“[DYN]
不仅Hash Key允许唯一标识记录,而且还是确保负载分配的机制。范围键(使用时)有助于指示将主要一起检索的记录,因此,存储也可以针对此类需求进行优化。
以下链接有关于该主题的完整说明: