จำนวนแอ็ตทริบิวต์ในคีย์สคีมาต้องตรงกับจำนวนแอ็ตทริบิวต์ที่กำหนดไว้ในนิยามแอ็ตทริบิวต์


114

ฉันกำลังพยายามสร้างตารางง่ายๆโดยใช้ DynamoDB javascript shell และฉันได้รับข้อยกเว้นนี้:


    {   
    "message": "The number of attributes in key schema must match the number of attributes defined in attribute definitions.",
    "code": "ValidationException",
    "time": "2015-06-16T10:24:23.319Z",
    "statusCode": 400,
    "retryable": false 
    }

ด้านล่างนี้คือตารางที่ฉันพยายามสร้าง:


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

อย่างไรก็ตามหากฉันเพิ่มแอตทริบิวต์ที่สองใน keySchema ก็ใช้ได้ดี ด้านล่างโต๊ะทำงาน:


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },
            { 
                AttributeName: 'attribute_name_1', 
                KeyType: 'RANGE', 
            }

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

ฉันไม่ต้องการเพิ่มช่วงในคีย์สคีมา มีความคิดอย่างไรในการแก้ไข


สิ่งนี้เกิดขึ้นเฉพาะกับ DynamoDBLocal หรือไม่ จะเกิดอะไรขึ้นเมื่อคุณพยายามทำสิ่งเดียวกันกับบริการจริง
mkobit

ฉันยังไม่มีบัญชี AWS จึงไม่สามารถทดสอบกับบริการจริงได้ ฉันใช้ DynamoDB local เวอร์ชันล่าสุด (dynamodb_local_2015-04-27_1.0)
NAbbas

1
ฉันพบพฤติกรรมเดียวกันกับ dynamodb_local_2016-04-19
คริส

2
ไม่เป็นไร TL ของ Mingliang DR บอกทุกอย่าง
คริส

คำตอบ:


242

TL; DR อย่ารวมนิยามแอตทริบิวต์ที่ไม่ใช่คีย์ไว้ในAttributeDefinitions.

DynamoDB ไม่มีสกีมา (ยกเว้นคีย์สคีมา)

กล่าวคือคุณต้องระบุคีย์สคีมา (ชื่อแอตทริบิวต์และประเภท) เมื่อคุณสร้างตาราง คุณไม่จำเป็นต้องระบุแอตทริบิวต์ที่ไม่ใช่คีย์ คุณสามารถใส่รายการที่มีแอตทริบิวต์ใดก็ได้ในภายหลัง (ต้องใส่คีย์แน่นอน)

จากหน้าเอกสารที่AttributeDefinitionsถูกกำหนดให้เป็น:

อาร์เรย์ของแอ็ตทริบิวต์ที่อธิบายคีย์สคีมาสำหรับตารางและดัชนี

เมื่อคุณสร้างตารางAttributeDefinitionsฟิลด์จะใช้สำหรับคีย์แฮชและ / หรือช่วงเท่านั้น ในกรณีแรกของคุณมีคีย์แฮชเท่านั้น (หมายเลข 1) ในขณะที่คุณระบุ AttributeDefinitions 2 รายการ นี่คือต้นตอของข้อยกเว้น


11
ด้วยข้อยกเว้นประการหนึ่งที่ฉันเชื่อว่าแอตทริบิวต์ที่ไม่ใช่คีย์ควรอยู่ในAttributeDefinitionsกรณีที่คีย์นั้นจะถูกใช้เป็นhashหรือrangeคีย์ในดัชนี
Srle

25

เมื่อคุณใช้แอตทริบิวต์ที่ไม่ใช่คีย์ใน at "AttributeDefinitions"คุณต้องใช้เป็นดัชนีมิฉะนั้นจะขัดต่อวิธีการทำงานของ DynamoDB ดู การเชื่อมโยง

ดังนั้นไม่จำเป็นต้องใส่แอตทริบิวต์ที่ไม่ใช่คีย์"AttributeDefinitions"หากคุณไม่ได้ใช้เป็นดัชนีหรือคีย์หลัก

var params = {
        TableName: 'table_name',
        KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
            { // Required HASH type attribute
                AttributeName: 'UserId',
                KeyType: 'HASH',
            },
            { // Optional RANGE key type for HASH + RANGE tables
                AttributeName: 'RemindTime', 
                KeyType: 'RANGE', 
            }
        ],
        AttributeDefinitions: [ // The names and types of all primary and index key attributes only
            {
                AttributeName: 'UserId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'RemindTime',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'AlarmId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            // ... more attributes ...
        ],
        ProvisionedThroughput: { // required provisioned throughput for the table
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },
        LocalSecondaryIndexes: [ // optional (list of LocalSecondaryIndex)
            { 
                IndexName: 'index_UserId_AlarmId',
                KeySchema: [ 
                    { // Required HASH type attribute - must match the table's HASH key attribute name
                        AttributeName: 'UserId',
                        KeyType: 'HASH',
                    },
                    { // alternate RANGE key attribute for the secondary index
                        AttributeName: 'AlarmId', 
                        KeyType: 'RANGE', 
                    }
                ],
                Projection: { // required
                    ProjectionType: 'ALL', // (ALL | KEYS_ONLY | INCLUDE)
                },
            },
            // ... more local secondary indexes ...
        ],
    };
    dynamodb.createTable(params, function(err, data) {
        if (err) ppJson(err); // an error occurred
        else ppJson(data); // successful response
    });

2

ฉันมีปัญหานี้เช่นกันและฉันจะโพสต์สิ่งที่ผิดพลาดสำหรับฉันไว้ที่นี่เผื่อว่ามันจะช่วยคนอื่นได้

ในของCreateTableRequestฉันฉันมีอาร์เรย์ว่างสำหรับGlobalSecondaryIndexes.

CreateTableRequest createTableRequest = new CreateTableRequest
{
  TableName = TableName,
  ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 2, WriteCapacityUnits = 2 },
  KeySchema = new List<KeySchemaElement>
  {
     new KeySchemaElement
     {
        AttributeName = "Field1",
        KeyType = KeyType.HASH
     },
     new KeySchemaElement
     {
        AttributeName = "Field2",
        KeyType = KeyType.RANGE
     }
  },
  AttributeDefinitions = new List<AttributeDefinition>()
  {
     new AttributeDefinition
     {
         AttributeName = "Field1", 
         AttributeType = ScalarAttributeType.S
     },
     new AttributeDefinition
     {
        AttributeName = "Field2",
        AttributeType = ScalarAttributeType.S
     }
  },
  //GlobalSecondaryIndexes = new List<GlobalSecondaryIndex>
  //{                            
  //}
};

การแสดงความคิดเห็นในบรรทัดเหล่านี้ในการสร้างตารางช่วยแก้ปัญหาของฉันได้ ดังนั้นฉันเดาว่ารายการจะต้องnullไม่ว่างเปล่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.