当前位置: 首页 > 知识库问答 >
问题:

使用DynamoDB从辅助索引获取GetItem

赫连瑾瑜
2023-03-14

我刚刚开始使用DynamoDB并设置了一个“accounts”表。

我已经设置了一个辅助索引,以便可以查询api用户和用户键。这两个值都不是主键,因为它们都是易变的,并且可以更改。

该表是用

TableName: "Accounts",
        KeySchema:  [
            { AttributeName: "id", KeyType: "HASH" },
            { AttributeName: "email", KeyType: "RANGE" }
        ],
        AttributeDefinitions: [
            { AttributeName: "id", AttributeType: "S" },
            { AttributeName: "email", AttributeType: "S" }
        ]

索引为

 TableName: 'Accounts',
            AttributeDefinitions: [
                {AttributeName: 'name', AttributeType: 'S'},
                {AttributeName: 'apiKey', AttributeType: 'S'}
            ],
            GlobalSecondaryIndexUpdates: [
                {
                    Create: {
                        IndexName: "ApiAccounts",
                        ProvisionedThroughput: {
                            ReadCapacityUnits: 1, WriteCapacityUnits: 1
                        },
                        KeySchema: [
                            {AttributeName: 'name', KeyType: "HASH"},
                            {AttributeName: 'apiKey', KeyType: "STRING"} 
                        ],
                        Projection: {
                            ProjectionType: "KEYS_ONLY"
                        },

我现在试图通过查询APIAccounts索引来获取uses帐户。

我在努力

 dynamoClient.get({
            TableName: 'Accounts',
            IndexName: 'ApiAccounts',
            Key: {
                name: nameKeyArray[0],
                apiKey: nameKeyArray[1]
            }, callback)

但是我得到了一个错误一个必需的键没有给出值,这使我认为我不能对索引执行“get”?或者我没有正确地引用索引。谁能帮我澄清一下吗?

名称和API键是唯一的,所以我想尽可能避免查询或扫描

共有1个答案

郑俊彦
2023-03-14

我想从官方文件上看不太清楚。您可以对GSI索引执行scanquery操作,但不能执行getitem操作。

对于中的每个记录/项,它们必须具有唯一的哈希范围键。

即。

// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "abc@email.com", "john", "key1") // OK
account.putItem("1", "abc@email.com", "john", "key1") // NOT OK, id and email are table HASH and RANGE keys, must be unique

但是对于indexhashrange键不是唯一的,它们可能包含重复的记录/项。

即。

// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "abc@email.com", "john", "key1") // OK
account.putItem("1", "bcd@email.com", "john", "key1") // OK

即。

// assume dummy api putItem(id, email, name, apiKey)
account.putItem("1", "abc@email.com", "john", "key1") // OK
account.putItem("2", "abc@email.com", "john", "key1") // OK

Java

http://docs.aws.amazon.com/awsjavasdk/latest/javadoc/com/amazonaws/services/dynamodbv2/document/index.html

index实现QueryAPIScanAPI但不实现GetItemAPI

JavaScript

http://docs.aws.amazon.com/awsjavascriptsdk/latest/aws/dynamodb.html#getitem-property

getitem不接受indexname作为参数。

http://docs.aws.amazon.com/awsjavascriptsdk/latest/aws/dynamodb.html#查询-属性

query接受indexname作为参数。

http://docs.aws.amazon.com/awsjavascriptsdk/latest/aws/dynamodb.html#扫描-属性

scan接受indexname作为参数。

 类似资料:
  • 我在DynamoDB中有一个表,它有列(1.id、2.item、3.entry time),其中id是主键。我需要在过去24小时内输入到表中的一种类型(有两种类型的项目,让它是A和B,我需要A的计数)的所有项目的计数。有什么办法可以使用二级索引做到这一点吗?我找不到太多与此相关的信息。

  • 我们可以仅用全局辅助索引更新dynamodb项吗? 在上面的代码中,我想要替换键节,并使用一个全局辅助索引更新项,即user_id。

  • 我有一个具有以下属性的dynamo表: ID(数字-主键) 标题(字符串) created_at(数字长) 标记(StringSet-包含一组标记,例如android、ios等,) 我想要能够通过标签查询-让我所有的项目标签Android。我怎么能在Dynamodb里做到这一点呢?似乎只能在ScalarDataTypes(即Number和String)上构建全局辅助索引,而不能在集合内的项上构建全

  • 我有一个现有的表,它有两个字段-主键和全局辅助索引: 既然attributeA作为全局辅助索引,我可以通过为全局辅助索引指定一个值来删除所有项吗?例如,我想删除所有属性为id1的记录-这在Dynamo中是可能的吗? Dynamo提供了关于删除索引本身的文档,但没有特别说明是否可以使用GSI删除多个项

  • 问题内容: 如何从JTable索引获取行?我查看了成员函数,但没有类似getRowAt的东西。有人可以帮忙吗? 问题答案: 表没有“行”对象,因此使用getRow方法无法获得任何结果。 您可以要求获取各个值,将其用于每一列,然后获得完整的行。

  • 问题内容: 我在python中有一个元组(“ A”,“ B”,“ C”,“ D”,“ E”),如何获取特定索引号下的哪个项目? 示例:假设给定0,它将返回A。给定2,将返回C。给定4,它将返回E。 问题答案: 您显示的不是,而是一个(圆括号而不是方括号显示)。但是,无论是索引列表 还是 元组(在索引中获取一项),无论哪种情况,都需要将索引附加在方括号中。 所以: 打印,等等。 元组(不同于列表)是