Anahtar şemadaki özniteliklerin sayısı öznitelik tanımlarında tanımlanan özniteliklerin sayısıyla eşleşmelidir


114

DynamoDB javascript kabuğunu kullanarak basit bir tablo oluşturmaya çalışıyorum ve şu istisnayı alıyorum:


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

Oluşturmaya çalıştığım tablo aşağıdadır:


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

Ancak, keySchema'ya ikinci özniteliği eklersem, sorunsuz çalışıyor. Çalışma masasının altında:


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

Aralığı anahtar şemaya eklemek istemiyorum. Nasıl düzeltileceğine dair bir fikrin var mı?


Bu yalnızca DynamoDBLocal'a karşı mı olur? Aynı şeyi gerçek hizmete karşı yapmaya çalıştığınızda ne olur?
mkobit

Henüz bir AWS hesabım yok, bu yüzden gerçek hizmetle test edemedim. DynamoDB local'in en son sürümünü kullanıyorum (dynamodb_local_2015-04-27_1.0).
NAbbas

1
Dynamodb_local_2016-04-19 ile aynı davranışı yaşıyorum
Chris

2
Nevermind, Mingliang'ın TL'si; DR her şeyi söylüyor.
Chris

Yanıtlar:


242

TL; DR'ye anahtar olmayan herhangi bir öznitelik tanımını dahil etmeyin AttributeDefinitions.

DynamoDB şemasızdır (anahtar şema hariç)

Yani tabloyu oluştururken anahtar şemasını (öznitelik adı ve türü) belirtmeniz gerekir. Anahtar olmayan nitelikler belirtmenize gerek yok. Herhangi bir niteliğe sahip bir öğeyi daha sonra koyabilirsiniz (elbette anahtarları içermelidir).

Gönderen dokümantasyon sayfasından , AttributeDefinitionsolarak tanımlanır:

Tablo ve dizinler için anahtar şemayı tanımlayan bir öznitelik dizisi.

Tablo oluşturduğunuzda, AttributeDefinitionsalan yalnızca karma ve / veya aralık anahtarları için kullanılır. İlk durumunuzda, 2 AttributeDefinitions sağlarken yalnızca hash key (1 numara) vardır. İstisnanın temel nedeni budur.


11
bir istisna dışında ben olmayan anahtar özellik olmalıdır, inan AttributeDefinitionso anahtar olarak kullanılacaksa hashveya rangeanahtar endeksinde
Srle

25

"AttributeDefinitions"İçinde anahtar olmayan özniteliği kullandığınızda, bunu dizin olarak kullanmalısınız, aksi takdirde DynamoDB'nin çalışma biçimine aykırıdır. Bağlantıya bakın .

Dolayısıyla, "AttributeDefinitions"onu dizin veya birincil anahtar olarak kullanmayacaksanız, anahtar olmayan bir öznitelik eklemenize gerek yoktur .

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

Ben de bu problemi yaşadım ve başka birine yardım etmesi durumunda benim için neyin yanlış gittiğini buraya göndereceğim.

Benim CreateTableRequestiçin boş bir dizi vardı 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>
  //{                            
  //}
};

Tablo oluşturmada bu satırları yorumlamak sorunumu çözdü. Sanırım liste nullboş değil , olmalı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.