我可以使用二级索引上的条件查询dynamodb表。我不想在hashkey上保留任何条件。有办法吗?
答案 0 :(得分:1)
截至2013年12月,您可以。 Dynamo支持全球二级索引。
有关如何执行查询,请参阅documentation页面。您基本上必须指定表和索引。如果您在索引上预测了所有属性,则可以获取记录,或者获取原始哈希键,您可以使用该哈希键在表中查找对象,就像之前一样。
答案 1 :(得分:0)
不,要查询DynamoDB,您必须知道哈希键。如果您不知道散列键,则获取数据的唯一方法是全表扫描。
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以使用二级索引查询动态集。
let params = {
TableName: 'users',
KeyConditionExpression: "#_id = :_id",
IndexName: "_id-index",
ExpressionAttributeNames:{
"#_id": "_id"
},
ExpressionAttributeValues: {
":_id":userId
}
};
documentClient.query(params, function (err, data) {
if (err) {
callback(err);
}
else {
if (data && data.Items && data.Items[0].accessToken) {
userData = data.Items[0];
}
else userData ={};
callback(null,{userData:userData})
}
})
答案 4 :(得分:0)
TL; DR 是的,可以基于二级索引进行查询。
示例:
因此,请考虑具有以下结构的表:
- user_id (partition key)
- created_at (sort key)
- account_id
- api_path
- execution_time
- platform
- ttl
- metadata
如果要基于account_id进行查询,则可以按以下方式创建GSI:
account_id (partition key)
created_at (sort key)
让我们说您称这个索引为:account_id-created_at-index
现在可以按以下方式查询它们(为简便起见,将python作为首选语言,这适用于所有SDK):
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = db.Table('table_name')
response = table.query(KeyConditionExpression=Key('account_id').eq(some_account_id), IndexName=account_id-created_at-index)
请注意此处的 IndexName 参数。
如果有任何适用于KeyConditionExpression
的项目,则可以在response['Items']
中将它们作为对象列表进行访问。
答案 5 :(得分:0)
是的,您可以仅使用二级索引来查询DynamoDb,而无需使用任何HASH键。
假设您有DynamoDB表EmployeeData
,其中包含EmployeeID,Department和created_at_date列。此表的分区键是EmployeeID,排序键是Department。
您要基于创建的日期来获取数据。因此,首先在DynamoDB表上创建名称为date-index
的二级索引。
然后,您可以使用以下代码获取具有二级索引的数据:
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('EmployeeData')
response = table.query(IndexName="date-index",
KeyConditionExpression=Key('created_at_date').eq('2020-01-03'))
print(response)