【问题标题】:How to define "Map" AttributeType in dynamo db?如何在 dynamodb 中定义“地图”属性类型?
【发布时间】:2021-09-02 23:29:51
【问题描述】:

我是 aws dynamo db 的新手。我have read,我们可以在发电机数据库的架构中设置M 类型的attributeValue。

但是当我执行下面的代码时

var params = {
    TableName: 'product',
    KeySchema: [
        {
            AttributeName: 'productType',
            KeyType: 'HASH'
        },
         {
            AttributeName: 'manufacturer',
            KeyType: 'SORT'
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: 'productType',
            AttributeType: 'S'
        },
         {
            AttributeName: 'manufacturer',
            AttributeType: 'M'
        }
    ],
     ProvisionedThroughput: {
        ReadCapacityUnits: 1, 
        WriteCapacityUnits: 1, 
    }

};
dynamodb.createTable(params, function(err, data) {
   console.log(err, data);

});

它不断抛出错误{"message":"Member must satisfy enum value set: [B, N, S]","code":"ValidationException","time":"2018-02-07T11:20:12.930Z","statusCode":400,"retryable":false}

但是上面的链接说有一个 Map 类型的属性可用。有人可以解释一下如何在 dynamo db 中实现 Map。

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    当你创建一个 dynamodb 表,或者给它添加一个索引时,你只能定义索引的属性。换句话说,您只能定义用于分区键或排序键的属性。就像您在示例中所做的那样。但唯一对键有效的属性类型是 S(字符串)、N(数字)和 B(二进制)。映射对于分区键或排序键都不是有效的属性类型,因此在定义表或索引时不能使用它们。

    DynamoDB 没有架构。除了在创建表时为索引键定义的属性之外,您没有定义任何属性。如果您想在表格中添加地图,只需在放置或更新项目时插入地图即可。

    【讨论】:

    • 如何将 Map 中的属性定义为索引?
    • @Purefan - 只有标量类型可以在索引中。
    【解决方案2】:

    这基本上是 DynamoDB 与 MongoDB 或 couchbase 相比的缺点。其他 NoSQL Dbs 可以让您拥有任何形状的文档并索引任何属性,无论它有多深。在 DD 中,您没有这种灵活性 - 可索引的顶级属性必须是标量。这是速度的权衡。

    【讨论】:

      【解决方案3】:

      您可以查看here for attribute definitions,唯一允许的值是B, N, S

      您应该使用字符串来定义您的地图。

      【讨论】:

        【解决方案4】:

        要插入地图类型,您应该像下面这样格式化数据,

        "M": {"Name": {"S": "Joe"}, "Age": {"N": "35"}} 

        请从 AWS 文档中找到屏幕截图,

        在本例中,“M”表示 Map 数据类型,“Name”是键,“S”(字符串)是该键的数据类型,值是“Joe”,依此类推

        另外,请阅读文档here

        【讨论】:

        • 我知道要插入数据,我必须以上述格式编写对象(“M”:{“Name”:{“S”:“Joe”},“Age”:{“N ": "35"}}) 但在此之前我必须创建表并且在创建表时出错,这就是我的问题。
        • 再次,如果我存储像 ("M": {"Name": {"S": "Joe"}, "Age": {"N": "35"}}) 这样的数据扫描表后,我得到了相同格式的数据,如果我想获取“Joe”,那么我必须写“data.M.Name.S”,为什么我不能只保存像 {Name:“Joe”,Age 这样的普通对象: "35"}?
        【解决方案5】:

        The AttributeDefinition property type represents an attribute for describing the key schema for a DynamoDB table and indexes. 创建表时只有两个属性是必需的,分区键和排序键(如果可用)。如果您打算使用 manufacturer 键作为索引,请注意这是一个无效操作,因为 dynamodb 仅支持标量数据类型。

        tl;dr 因此,在创建表时,您应该省略“非键/索引”属性,在您的情况下是 manufacturer 键。

        【讨论】:

          猜你喜欢
          • 2022-01-22
          • 2015-09-01
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-08
          相关资源
          最近更新 更多