当前位置: 首页 > 知识库问答 >
问题:

键架构中的属性数必须与属性定义中定义的属性数匹配

禄仲渊
2023-03-14

我正在尝试使用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,它就可以正常工作。a工作台下方:

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

我不想将范围添加到密钥架构。知道怎么修吗?

共有3个答案

徐鸿文
2023-03-14

仅当要使用KeySchema中的属性时,才在AttrubutedDefinitions中声明属性

当这些属性将用于全局二次索引(globalsecondaryindex)或本地二次索引(localsecondaryindex)时

对于使用yaml文件的任何人:

示例1:

假设您有3个属性-

    AuctionsTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: AuctionsTable
        BillingMode: PAY_PER_REQUEST
        
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S

        KeySchema:
          - AttributeName: id 
            KeyType: HASH

例子2:

对于相同的属性(即. id、status和createdAt),如果您也有Global秒级索引Local秒级索引,那么您的yaml文件如下所示:

AuctionsTable:
  Type: AWS::DynamoDB::Table
  Properties:
    TableName: AuctionsTable-${self:provider.stage}
    BillingMode: PAY_PER_REQUEST
    AttributeDefinitions:
      - AttributeName: id
        AttributeType: S
      - AttributeName: status
        AttributeType: S
      - AttributeName: endingAt
        AttributeType: S
    KeySchema:
      - AttributeName: id
        KeyType: HASH
    GlobalSecondaryIndexes:
      - IndexName: statusAndEndDate
        KeySchema:
          - AttributeName: status
            KeyType: HASH
          - AttributeName: endingAt
            KeyType: RANGE
        Projection:
          ProjectionType: ALL

我们在AttributeDefinitions中包含status和createdId仅仅是因为我们有一个使用上述属性的GlobalSecondaryIndex。

原因:DynamoDB只关心主键、Global秒级索引和Local秒级索引。您不需要指定不属于上述三重奏的任何其他类型的属性。

DynamoDB只关心用于分区的主键、GlobalSecondaryIndex和LocalSecondaryIndex。它不关心你对一个项目有什么其他属性。

鄢飞鸾
2023-03-14

当您在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
        });```
桑博远
2023-03-14

TL;DR在属性定义中不包括任何非关键属性定义。

DynamoDB是无模式的(除了键模式)

也就是说,创建表时确实需要指定键模式(属性名称和类型)。嗯,您不需要指定任何非关键属性。您可以稍后放置具有任何属性的项(当然必须包括键)。

在文档页面中,属性定义定义定义为:

描述表和索引的键架构的属性数组。

当您创建表时,属性定义字段仅用于哈希和/或范围键。在您的第一种情况下,只有哈希键(编号1),而您提供了2个属性定义。这是异常的根本原因。

 类似资料:
  • 试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!

  • 问题内容: 我正在借助以下方法设置新的React:https : //github.com/facebookincubator/create-react- app 但是,我遇到了一个棉绒问题。我收到以下掉毛错误。 这是导致问题的代码: 我试着使用react / prop-types规则,但无济于事。 问题答案: 根据这个问题发表评论。 这似乎是因为您在安装时仅应使用create-react- ap

  • 我们在 field 对应的 Tag 中对 Column 的一些属性进行定义,定义的方法基本和我们写SQL定义表结构类似,比如: type User struct { Id int64 Name string `xorm:"varchar(25) notnull unique 'usr_name' comment('姓名')"` } 对于不同的数据库系统,数据类型其实

  • 问题内容: 我需要在CSS中定义的src属性。有没有办法指定这个属性? 问题答案:

  • 本文向大家介绍C#自定义属性,包括了C#自定义属性的使用技巧和注意事项,需要的朋友参考一下 示例 查找具有自定义属性的属性-MyAttribute 查找给定属性上的所有自定义属性 枚举具有自定义属性的所有类-MyAttribute 在运行时读取自定义属性的值 用法            

  • 自定义标签的意义在于方便管理,可以给SIM卡增加一个标签,并且针对某个标签进行统计、查询及管理。支持批量操作。 设置号码自定义标签 支持针对订单、针对iccid进行自定义标签的设置。 号码详情页查询/设置自定义标签 号码详情页,可以查看当前号码已设置的自定义标签,并且可以针对其添加、修改。 自定义标签管理 可以增加、修改、删除自定义属性及其值。