仅使用dynamo DB中的二级索引进行查询

时间:2013-07-08 18:15:24

标签: amazon-dynamodb

我可以使用二级索引上的条件查询dynamodb表。我不想在hashkey上保留任何条件。有办法吗?

6 个答案:

答案 0 :(得分:1)

截至2013年12月,您可以。 Dynamo支持全球二级索引。

有关如何执行查询,请参阅documentation页面。您基本上必须指定表和索引。如果您在索引上预测了所有属性,则可以获取记录,或者获取原始哈希键,您可以使用该哈希键在表中查找对象,就像之前一样。

答案 1 :(得分:0)

不,要查询DynamoDB,您必须知道哈希键。如果您不知道散列键,则获取数据的唯一方法是全表扫描。

答案 2 :(得分:0)

Query操作始终需要哈希密钥,即使您要查询LSIGSI也是如此。

答案 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)