我想通过 dynamoDB 创建表
User
,其中包含一些由 swagger 设计的属性:
User {
id (string, optional): UUID of User ,
name (string, optional),
lastLoginedAt (string, optional),
avatar (Avatar, optional),
}
Avatar {
avatarId (string, optional):,
iconUri (string, optional),
message (string, optional),
}
并且想要
User
将在 putItem 之后以 json 响应,如下所示:
{
"id": "string",
"name": "string",
"lastLoginedAt": "2016-06-24 15:28:26",
"avatar": {
"avatarId": "string",
"iconUri": "string",
"message": "string"
},
}
我是 Dynamodb 初学者,我仍然坚持创建表,这是我的代码:
$dynamodb->createTable([
'TableName' => 'User',
'AttributeDefinitions' => [
[ 'AttributeName' => 'id', 'AttributeType' => 'S' ],
[ 'AttributeName' => 'name', 'AttributeType' => 'S' ],
[ 'AttributeName' => 'avatar', 'AttributeType' => 'S' ]
],
'KeySchema' => [
[ 'AttributeName' => 'id', 'KeyType' => 'HASH' ],
[ 'AttributeName' => 'name', 'KeyType' => 'RANGE' ]
],
'GlobalSecondaryIndexes' => [
[
'IndexName' => 'avatarIndex',
'KeySchema' => [
[ 'AttributeName' => 'avatarId', 'KeyType' => 'HASH' ],
[ 'AttributeName' => 'id', 'KeyType' => 'RANGE' ]
],
'Projection' => [
'ProjectionType' => 'INCLUDE',
'NonKeyAttributes' => [ 'iconUri', 'message' ]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 5
]
]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 5
]]);
这是错误:
local.ERROR: Error executing "CreateTable" on "http://172.18.0.5:8000"; AWS HTTP error: Client error: `POST http://172.18.0.5:8000` resulted in a `400 Bad Request` response:{"__type":"com.amazon.coral.validate#ValidationException","message":"Global Secondary Index hash key not specified in At (truncated...)
ValidationException (client): Global Secondary Index hash key not specified in Attribute Definitons.Type unknown. - {"__type":"com.amazon.coral.validate#ValidationException","message":"Global Secondary Index hash key not specified in Attribute Definitons.Type unknown."}
提前致谢!
根据错误,您似乎忘记在主表中添加属性,以下代码应该可以工作
$dynamodb->createTable([
'TableName' => 'User',
'AttributeDefinitions' => [
[ 'AttributeName' => 'id', 'AttributeType' => 'S' ],
[ 'AttributeName' => 'name', 'AttributeType' => 'S' ],
[ 'AttributeName' => 'avatar', 'AttributeType' => 'S' ],
[ 'AttributeName' => 'avatarId', 'AttributeType' => 'S' ], // this attribute was missing
],
'KeySchema' => [
[ 'AttributeName' => 'id', 'KeyType' => 'HASH' ],
[ 'AttributeName' => 'name', 'KeyType' => 'RANGE' ]
],
'GlobalSecondaryIndexes' => [
[
'IndexName' => 'avatarIndex',
'KeySchema' => [
[ 'AttributeName' => 'avatarId', 'KeyType' => 'HASH' ],
[ 'AttributeName' => 'id', 'KeyType' => 'RANGE' ]
],
'Projection' => [
'ProjectionType' => 'INCLUDE',
'NonKeyAttributes' => [ 'iconUri', 'message' ]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 5
]
]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 5
]]);
您必须在主表属性定义中包含 GSI 的哈希和范围属性。除此之外,正如 Lokesh 提到的,您可以为 Avatar 对象使用 StringSet 数据类型。
希望有帮助。
在 Dynamodb 中,您无法保存复杂的对象。在您的情况下,您无法将其保存为复杂的对象。
但是您可以将头像对象 JSON 保存为字符串,并且头像将仅是字符串类型的列。
将任何 JSON 保存为字符串后,您将无法在 JSON 内创建属性的索引。
在您的情况下,您不应该以 json 格式保存头像。您可以创建 avatarId、avatarIconUri 和 avatarMessage 等列。
{
"id": "string",
"name": "string",
"lastLoginedAt": "2016-06-24 15:28:26",
"avatarId": "string",
"avatarIconUri": "string",
"avatarMessage": "string"
}
GlobalSecondaryIndexes' => [
[
'IndexName' => 'avatarIndex',
'KeySchema' => [
[ 'AttributeName' => 'avatarId', 'KeyType' => 'HASH' ],
[ 'AttributeName' => 'id', 'KeyType' => 'RANGE' ]
],
'Projection' => [
'ProjectionType' => 'INCLUDE',
'NonKeyAttributes' => [ 'avatarIconUri', 'avatarMessage' ]
],
'ProvisionedThroughput' => [
'ReadCapacityUnits' => 5,
'WriteCapacityUnits' => 5
]
]
],
我在尝试创建名称中带有 - 的全局二级索引时遇到此错误 - 显然对于列名来说是可以的。