मुख्य स्कीमा में विशेषताओं की संख्या को विशेषता परिभाषाओं में परिभाषित विशेषताओं की संख्या से मेल खाना चाहिए


107

मैं DynamoDB जावास्क्रिप्ट शेल का उपयोग करके एक सरल तालिका बनाने की कोशिश कर रहा हूं और मुझे यह अपवाद मिल रहा है:


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

मैं सीमा को मुख्य स्कीमा में नहीं जोड़ना चाहता। इसे कैसे ठीक किया जाये, कोई विचार?


क्या यह केवल डायनमोल्डब्लॉक के खिलाफ होता है? जब आप वास्तविक सेवा के खिलाफ एक ही काम करने की कोशिश करते हैं तो क्या होता है?
mkobit

मेरे पास अभी तक AWS खाता नहीं है, इसलिए वास्तविक सेवा के खिलाफ इसका परीक्षण नहीं कर सका। मैं DynamoDB लोकल के नवीनतम संस्करण (डायनामोडब_लोकल_2015-04-27_1.0) का उपयोग कर रहा हूं।
नायबस

1
मैं डायनामोडब_लोकल_2016-04-19 के साथ समान व्यवहार का अनुभव कर रहा हूं
क्रिस

2
नेवरमाइंड, मिंगलियान की टीएल; डीआर यह सब कहता है।
क्रिस

जवाबों:


227

डायनेमोबडी स्कीमालेस है (प्रमुख स्कीमा को छोड़कर)

यह कहना है, जब आप तालिका बनाते हैं तो आपको मुख्य स्कीमा (विशेषता नाम और प्रकार) निर्दिष्ट करने की आवश्यकता होती है। ठीक है, आपको किसी गैर-महत्वपूर्ण विशेषता को निर्दिष्ट करने की आवश्यकता नहीं है। आप बाद में किसी भी विशेषता के साथ एक आइटम डाल सकते हैं (पाठ्यक्रम की कुंजियों को शामिल करना चाहिए)।

से प्रलेखन पेज , AttributeDefinitionsके रूप में परिभाषित किया गया है:

विशेषताओं की एक सरणी जो तालिका और अनुक्रमित के लिए मुख्य स्कीमा का वर्णन करती है।

जब आप तालिका बनाते हैं, तो AttributeDefinitionsफ़ील्ड केवल हैश और / या रेंज कुंजियों के लिए उपयोग की जाती है। आपके पहले मामले में, केवल हैश की (नंबर 1) है, जबकि आप 2 एट्रिब्यूटडिफिनिशन प्रदान करते हैं। यह अपवाद का मूल कारण है।

TL; DR में कोई भी गैर-कुंजी विशेषता परिभाषा शामिल नहीं है AttributeDefinitions


10
एक अपवाद के साथ, मेरा मानना ​​है कि गैर-कुंजी विशेषता होना चाहिए AttributeDefinitionsअगर उस कुंजी को सूचकांक में कुंजी hashया rangeकुंजी के रूप में उपयोग किया जाएगा
Srle

23

आप कम से गैर-प्रमुख विशेषता का उपयोग करते हैं "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खाली नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.