非键属性查询

问题描述 投票:0回答:2

看来 dynamodb 的

query
方法必须包含分区键作为过滤器的一部分。不知道分区键怎么查询?

例如,您有一个 User 表,其属性

userid
设置为分区键。现在我们想通过电话号码查找用户。是否可以在没有分区键的情况下执行查询?据我所知,使用
scan
方法可以实现此目标,但代价是在应用过滤器之前从表中提取所有项目。

amazon-dynamodb aws-sdk
2个回答
36
投票

您需要设置一个 全局二级索引 (GSI),使用您的

phoneNumber
列作为索引哈希键。

您可以通过调用 UpdateTable 创建 GSI。

创建索引后,您就可以使用 IndexName 调用

Query
,根据电话号码提取用户记录。


0
投票

如果您有全局二级索引,则索引的分区键就是属性名称。

例如

      Properties:
        TableName: entries
        BillingMode: PAY_PER_REQUEST
        AttributeDefinitions:
          - AttributeName: name
            AttributeType: S
          - AttributeName: display-name
            AttributeType: S
        KeySchema:
          - AttributeName: name
            KeyType: HASH
        GlobalSecondaryIndexes:
          - IndexName: display-name-index
            KeySchema:
              - AttributeName: display-name
                KeyType: HASH
            Projection:
              ProjectionType: ALL

然后您可以使用查询功能(这是使用 PHP SDK,但参数名称在其他 SDK 中应该相同 - https://docs.aws.amazon.com/aws-sdk-php/v3/api /api-dynamodb-2012-08-10.html很好地涵盖了它):

        $dynamoDB->query([
            'TableName' => 'entries',
            'IndexName' => 'display-name-index',
            'ExpressionAttributeNames' => [
                '#idx' => 'display-name'
            ],
            'ExpressionAttributeValues' => [
               ':arg' => [
                   'S' => $key,
               ],
            ],
            'KeyConditionExpression' => '#idx = :arg'
        ]);
© www.soinside.com 2019 - 2024. All rights reserved.