Số thuộc tính trong lược đồ khóa phải khớp với số thuộc tính được xác định trong định nghĩa thuộc tính


106

Tôi đang cố tạo một bảng đơn giản bằng cách sử dụng trình bao javascript DynamoDB và tôi nhận được ngoại lệ này:


    {   
    "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 
    }

Dưới đây là bảng tôi đang cố gắng tạo:


    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); 
    });

Tuy nhiên, nếu tôi thêm thuộc tính thứ hai vào keySchema, nó hoạt động tốt. Bên dưới bảng làm việc:


    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); 
    });

Tôi không muốn thêm phạm vi vào lược đồ chính. Bất kỳ ý tưởng làm thế nào để sửa chữa nó?


Điều này chỉ xảy ra với DynamoDBLocal? Điều gì xảy ra khi bạn cố gắng làm điều tương tự so với dịch vụ thực tế?
mkobit

Tôi chưa có tài khoản AWS nên không thể kiểm tra tài khoản này với dịch vụ thực tế. Tôi đang sử dụng phiên bản mới nhất của DynamoDB cục bộ (dynamicodb_local_2015-04-27_1.0).
NAbbas

1
Tôi đang gặp phải hành vi tương tự với dynamicodb_local_2016-04-19
Chris

2
Đừng bận tâm, TL của Mingliang; DR đã nói lên tất cả.
Chris

Câu trả lời:


226

DynamoDB là không có toán học (ngoại trừ lược đồ khóa)

Có nghĩa là, bạn cần chỉ định lược đồ khóa (tên và kiểu thuộc tính) khi bạn tạo bảng. Chà, bạn không cần chỉ định bất kỳ thuộc tính không phải khóa nào. Bạn có thể đặt một vật phẩm với bất kỳ thuộc tính nào sau đó (tất nhiên là phải bao gồm các khóa).

Từ trang tài liệu , AttributeDefinitionsđược định nghĩa là:

Một mảng các thuộc tính mô tả lược đồ chính cho bảng và các chỉ mục.

Khi bạn tạo bảng, AttributeDefinitionstrường chỉ được sử dụng cho các khóa băm và / hoặc phạm vi. Trong trường hợp đầu tiên của bạn, chỉ có khóa băm (số 1) trong khi bạn cung cấp 2 Định nghĩa thuộc tính. Đây là nguyên nhân sâu xa của ngoại lệ.

TL; DR Không bao gồm bất kỳ định nghĩa thuộc tính không phải khóa nào trong AttributeDefinitions.


10
với một ngoại lệ mà tôi tin rằng, thuộc tính không phải AttributeDefinitionskhóa sẽ được sử dụng nếu khóa đó sẽ được sử dụng làm hashhoặc rangekhóa trong chỉ mục
Srle

22

Khi bạn sử dụng thuộc tính không phải khóa tại tại "AttributeDefinitions", bạn phải sử dụng nó làm chỉ mục, nếu không nó sẽ chống lại cách hoạt động của DynamoDB. Xem liên kết .

Vì vậy, không cần phải đặt thuộc tính không phải khóa "AttributeDefinitions"nếu bạn không sử dụng nó làm chỉ mục hoặc khóa chính.

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

Tôi cũng gặp sự cố này và tôi sẽ đăng ở đây những gì đã xảy ra với tôi trong trường hợp nó giúp ích cho người khác.

Trong của tôi CreateTableRequest, tôi có một mảng trống cho 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>
  //{                            
  //}
};

Nhận xét những dòng này trong tạo bảng đã giải quyết được vấn đề của tôi. Vì vậy, tôi đoán danh sách phải có null, không được trống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.