1

我可以仅在二级索引上使用条件查询 dynamodb 表吗?我不想在哈希键上保留任何条件。有没有办法做到这一点?

4

6 回答 6

1

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

有关如何执行查询,请参阅文档页面。您基本上必须指定表和索引。如果您将所有属性投影到索引上,您可以取回一条记录,或者您可以获得原始哈希键,您可以使用它来像以前一样在表中查找对象。

于 2014-01-13T19:41:39.443 回答
0

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

于 2013-07-11T19:11:33.443 回答
0

Query操作始终需要哈希键,即使您查询的是LSIGS​​I

于 2015-05-01T05:27:28.553 回答
0

您可以使用二级索引查询 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})
        }
    })
于 2019-02-18T12:05:02.277 回答
0

是的,您可以仅使用二级索引查询 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)
于 2020-01-03T06:03:10.907 回答
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']as 对象列表中访问它们。

于 2019-03-07T08:22:43.747 回答