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

使用全局二级索引创建DynamoDB表

羊光辉
2023-03-14

我是AWS DynamoDB和nosql的新手,我对表创建有问题。

我试图创建一个名为User的表,具有以下属性:

  • 用户ID(HASH)
  • OSType(范围)
  • MSISDN
  • IMSI
  • 设备ID

我不仅需要通过UserId查询表,还需要通过以下字段查询表:

  • MSISDN

我的逻辑如下:

  1. 通过UserId字段查询表

在阅读了有关LSI/GSI的手册后,我很难理解如何创建表和定义这些索引。

这是我尝试使用PHP AWS SDK创建表的代码:

    $client->createTable(array(
    'TableName' => 'User',
    'AttributeDefinitions' => array(
        array('AttributeName' => 'UserId',      'AttributeType' => 'S'),
        array('AttributeName' => 'OSType',      'AttributeType' => 'S'),
        array('AttributeName' => 'MSISDN',      'AttributeType' => 'S'),
        array('AttributeName' => 'IMSI',        'AttributeType' => 'S'),
        array('AttributeName' => 'DeviceID',    'AttributeType' => 'S'),
    ),
    'KeySchema' => array(
        array('AttributeName' => 'UserId', 'KeyType' => 'HASH'),
        array('AttributeName' => 'OSType', 'KeyType' => 'RANGE')
    ),
    'GlobalSecondaryIndexes' => array(
        array(
            'IndexName' => 'IMSIIndex',
            'KeySchema' => array(
                array('AttributeName' => 'IMSI',    'KeyType' => 'HASH')
            ),
            'Projection' => array(
                'ProjectionType' => 'KEYS_ONLY',
            ),
            'ProvisionedThroughput' => array(
                'ReadCapacityUnits'  => 10,
                'WriteCapacityUnits' => 10
            )
        ),
        array(
            'IndexName' => 'MSISDNIndex',
            'KeySchema' => array(
                array('AttributeName' => 'MSISDN',  'KeyType' => 'HASH')
            ),
            'Projection' => array(
                'ProjectionType' => 'KEYS_ONLY',
            ),
            'ProvisionedThroughput' => array(
                'ReadCapacityUnits'  => 10,
                'WriteCapacityUnits' => 10
            )
        ),
        array(
            'IndexName' => 'DeviceIDIndex',
            'KeySchema' => array(
                array('AttributeName' => 'DeviceID',    'KeyType' => 'HASH')
            ),
            'Projection' => array(
                'ProjectionType' => 'KEYS_ONLY',
            ),
            'ProvisionedThroughput' => array(
                'ReadCapacityUnits'  => 10,
                'WriteCapacityUnits' => 10
            )
        ),
    ),
    'ProvisionedThroughput' => array(
        'ReadCapacityUnits'  => 50,
        'WriteCapacityUnits' => 50
    )
));

我得到了这个错误:

PHP Fatal error:  Uncaught Aws\DynamoDb\Exception\ValidationException: AWS Error Code: ValidationException, Status Code: 400, AWS Request ID: 70LGIARTTQF90S8P0HVRUKSJ27VV4KQNSO5AEMVJF66Q9ASUAAJG, AWS Error Type: client, AWS Error Message: One or more parameter values were invalid: Number of attributes in KeySchema does not exactly match number of attributes defined in AttributeDefinitions, User-Agent: aws-sdk-php2/2.4.11 Guzzle/3.7.4 curl/7.29.0 PHP/5.4.14

请帮助我理解我做错了什么。我想用GSI创建表,但我无法理解DynamoDB中二级索引的本质:(

共有2个答案

仲孙磊
2023-03-14

这应该行得通:

$client->createTable(array(
'TableName' => 'User',
'AttributeDefinitions' => array(
    array('AttributeName' => 'UserId',      'AttributeType' => 'S'),
    array('AttributeName' => 'OSType',      'AttributeType' => 'S')
),
'KeySchema' => array(
    array('AttributeName' => 'UserId', 'KeyType' => 'HASH'),
    array('AttributeName' => 'OSType', 'KeyType' => 'RANGE')
),
'GlobalSecondaryIndexes' => array(
    array(
        'IndexName' => 'IMSIIndex',
        'KeySchema' => array(
            array('AttributeName' => 'IMSI',    'KeyType' => 'HASH')
        ),
        'Projection' => array(
            'ProjectionType' => 'KEYS_ONLY',
        ),
        'ProvisionedThroughput' => array(
            'ReadCapacityUnits'  => 10,
            'WriteCapacityUnits' => 10
        )
    ),
    array(
        'IndexName' => 'MSISDNIndex',
        'KeySchema' => array(
            array('AttributeName' => 'MSISDN',  'KeyType' => 'HASH')
        ),
        'Projection' => array(
            'ProjectionType' => 'KEYS_ONLY',
        ),
        'ProvisionedThroughput' => array(
            'ReadCapacityUnits'  => 10,
            'WriteCapacityUnits' => 10
        )
    ),
    array(
        'IndexName' => 'DeviceIDIndex',
        'KeySchema' => array(
            array('AttributeName' => 'DeviceID',    'KeyType' => 'HASH')
        ),
        'Projection' => array(
            'ProjectionType' => 'KEYS_ONLY',
        ),
        'ProvisionedThroughput' => array(
            'ReadCapacityUnits'  => 10,
            'WriteCapacityUnits' => 10
        )
    ),
),
'ProvisionedThroughput' => array(
    'ReadCapacityUnits'  => 50,
    'WriteCapacityUnits' => 50
)));

希望这能有所帮助

常永长
2023-03-14

只有包含在本地和全局索引中的属性才能在AttributeDefinitions部分中定义

 类似资料:
  • AWS CLI for Dynamodb创建表在创建全局二级索引时有点混乱。在CLI文档中,它表示全局二级索引可以用以下表达式(简写)表示: 我的解释是,我应该这样做 请注意,我在这里不包括KeySchema来推断复杂性。控制台显示以下错误: 因此AWS CLI无法识别ProvisionedThroughput的映射表达式。我尝试了几种表达方式,但都没能成功。我也没有在谷歌上找到任何描述如何做的网

  • DynamoDB表已经创建并在生产中运行。根据当前用例,计划添加新的辅助全局索引。这可以通过AWS实现SDK,是否可以使用CloudForm脚本更新DynamoDB表。 任何帮助都将不胜感激。

  • 我有以下带有三个全局二级索引(GSI)的DyamoDB表 Id(主键)、user_id(GSI)、event_type(GSI)、product_id(GSI)、rate、create_date 我有以下三种查询模式: null null

  • 我仍然对本地二级索引的使用感到困惑。当需要LSI与GSI时,请给我具体的用例。 例如,“GenreAlbumTitle”索引应该是GSI还是LSI?https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.Prim

  • 我正在DynamoDB中创建一个表和GSI,使用以下参数,如文档所示: 是表的主键,我使用作为GSI的主键。(为了简洁起见,我删除了一些不必要的配置参数) 我正在使用以下命令查询此表: 但我一直在犯错误: "一个或多个参数值无效:条件参数类型与模式类型不匹配" 在文档中,它指定主可以是或,并且您可以在字段中设置。我正在以的形式发送,不确定这里缺少了什么。 问题是在我创建表的方式上,还是在我查询表的

  • 我有一个DynamoDB表,分区键为userID,没有排序键。该表在每个项目中还具有时间戳属性。我想检索在指定范围内具有时间戳的所有项目(无论用户ID如何,即跨所有分区)。在阅读文档并搜索堆栈溢出(此处)后,我发现需要为我的表创建一个GSI。因此,我使用以下键创建了一个GSI: 分区键: 排序键: 我正在使用Java SDK使用以下代码查询索引: 执行此代码时出现以下错误: 据我所知,我应该能够仅