如何在dynamo db中定义“Map”属性类型?

8
我是一个AWS DynamoDB新手。我已经阅读,在DynamoDB的模式中可以设置属性值(attributeValue)的M类型。
但是当我执行以下代码时:
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吗?

5个回答

29
在创建DynamoDB表或向其添加索引时,您只能为索引定义属性。换句话说,您只能定义用作分区键或排序键的属性,就像您在示例中所做的那样。但是,仅对键有效的属性类型是S(字符串),N(数字)和B(二进制)。对于分区键或排序键,地图不是有效的属性类型,因此在定义表格或索引时不能使用它们。
DynamoDB是无模式的。您在创建表时不需要定义任何属性,除了索引键所需的属性。如果您想要在表中使用地图,只需在插入或更新项目时插入即可。

1
在Map中定义一个属性作为索引怎么样? - Purefan
@Purefan - 只有标量类型可以用于索引。 - manojlds

2

这基本上是 DynamoDB 相对于 MongoDB 或 Couchbase 的劣势。其他 NoSQL 数据库可以让您拥有任何形状的文档,并索引任何深度的属性。在 DynamoDB 中,您没有此灵活性 - 可索引的顶级属性必须是标量。这是速度的权衡。


1

您可以查看这里的属性定义, 允许的值只有B, N, S

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


1

要插入地图类型,您应该按以下格式格式化数据:

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

请查看来自AWS文档的截图。

enter image description here

在这个例子中,“M”表示Map数据类型,“Name”是键,“S”(字符串)是该键的数据类型,值为“Joe”,以此类推。
另外,请阅读此处的文档。

我知道要插入数据,必须按照上述格式编写对象 ("M": {"Name": {"S": "Joe"}, "Age": {"N": "35"}}),但在此之前,我必须创建表格,而在创建表格时出现了错误,这就是我的问题所在。 - Vaibhav Patil
1
如果我存储的数据是 ("M": {"Name": {"S": "Joe"}, "Age": {"N": "35"}}),那么在扫描表格后,我得到的数据格式相同,如果我想获取“Joe”,那么我必须编写“data.M.Name.S”,为什么我不能保存像 {Name: "Joe", Age: "35"} 这样的简单对象呢? - Vaibhav Patil

0

AttributeDefinition 属性类型表示 DynamoDB 表和索引的键模式描述属性。创建表时,只有两个属性是必需的,即分区键和排序键(如果有)。如果您打算将 manufacturer 键用作索引,请注意这是无效操作,因为 DynamoDB 仅支持标量数据类型。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接