Javascript “如何定义”;“地图”;dynamo db中的AttributeType?

Javascript “如何定义”;“地图”;dynamo db中的AttributeType?,javascript,node.js,amazon-web-services,amazon-dynamodb,Javascript,Node.js,Amazon Web Services,Amazon Dynamodb,我是aws dynamo db的新手。我已经读到,我们可以在dynamo db()的模式中设置M类型的attributeValue 但当我执行下面的代码时 var params = { TableName: 'product', KeySchema: [ { AttributeName: 'productType', KeyType: 'HASH' }, {

我是aws dynamo db的新手。我已经读到,我们可以在dynamo db()的模式中设置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);

});
它抛出错误{“消息”:“成员必须满足枚举值集:[B,N,S]”,“代码”:“ValidationException”,“时间”:“2018-02-07T11:20:12.930Z”,“状态代码”:400,“可重试”:false}

但是上面的链接说有一个Map类型的属性可用。有人能告诉我如何在dynamo db中实现Map吗。 提前谢谢

您应该查看属性定义,仅允许的值是B、N、S


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

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

“M”:{“Name”:{“S”:“Joe”},“Age”:{“N”:“35”}
创建表时,只有两个属性是必需的,分区键和排序键(如果可用)。如果您打算使用
制造商
键作为索引,请注意这是一个无效的操作,因为dynamodb只支持标量数据类型


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

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


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

这基本上是DynamoDB的缺点,而不是MongoDB或couchbase。另一个NoSQL数据库可以让您拥有任何形状的文档,并索引任何属性,无论其深度如何。在DD中,您没有这种灵活性—可索引的顶级属性必须是标量。这是速度的权衡

我知道要插入数据,我必须以上面的格式(“M”:{“Name”:{“S”:“Joe”},“Age”:{“N”:“35”})写入对象,但在此之前,我必须创建表,并且在创建表时出错,这就是我的问题所在。同样,如果我像(“M”:{“Name”:{“S”:“Joe”},“Age”:{“N”:“35”})这样存储数据然后,在扫描了我以相同格式获得的表数据之后,如果我想获取“Joe”,那么我必须写“data.M.Name.S”,为什么我不能只保存像{Name:“Joe”,Age:“35”}这样的普通对象?在映射中定义一个属性作为索引怎么样?@Purefan-索引中只能有标量类型。