我可以仅在二级索引上使用条件查询 dynamodb 表吗?我不想在哈希键上保留任何条件。有没有办法做到这一点?
6 回答
截至 2013 年 12 月,您可以。Dynamo 支持全局二级索引。
有关如何执行查询,请参阅文档页面。您基本上必须指定表和索引。如果您将所有属性投影到索引上,您可以取回一条记录,或者您可以获得原始哈希键,您可以使用它来像以前一样在表中查找对象。
不,要查询 DynamoDB,您必须知道哈希键。如果您不知道哈希键,那么获取数据的唯一方法是全表扫描。
您可以使用二级索引查询 dynamodb。
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})
}
})
是的,您可以仅使用二级索引查询 DynamoDb,而无需使用任何 HASH 键。假设您有 DynamoDB 表EmployeeData
,其中包含 EmployeeID、Department 和 created_at_date 列。该表的分区键是 EmployeeID,排序键是 Department。您想要根据创建日期获取数据..所以首先date-index
在您的 DynamoDB 表上创建具有名称的二级索引..然后您可以使用以下代码获取具有二级索引的数据:
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)
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']
as 对象列表中访问它们。