Amazon dynamodb 在DynamoDB中存储非唯一数组

Amazon dynamodb 在DynamoDB中存储非唯一数组,amazon-dynamodb,Amazon Dynamodb,我是DynamoDB的新手,发现无模式数据库的“模型驱动”方式令人惊讶。不管怎样,小题大做,我想知道如何在一个项目中声明一个属性,这个项目将是一个值数组,但它可以有重复的值 具体来说,我存储的是情感词的wordcloud数组,如果某个词被多次使用,那么我想知道这一点。我的简单答案是有一个名为wordsPositive的属性/属性,它将被设置为类型“SS”,但这似乎不允许重复的数组元素 尝试时出现的错误是: 400:输入集合[更好、优秀、最佳、重要、良好、成功、最佳、创造性、强大、好处]包含重复项

我是DynamoDB的新手,发现无模式数据库的“模型驱动”方式令人惊讶。不管怎样,小题大做,我想知道如何在一个项目中声明一个属性,这个项目将是一个值数组,但它可以有重复的值

具体来说,我存储的是情感词的wordcloud数组,如果某个词被多次使用,那么我想知道这一点。我的简单答案是有一个名为wordsPositive的属性/属性,它将被设置为类型“SS”,但这似乎不允许重复的数组元素

尝试时出现的错误是:

400:输入集合[更好、优秀、最佳、重要、良好、成功、最佳、创造性、强大、好处]包含重复项。]

在没有重复记录的AWS web界面上查看,我可以看到定义的结构可以支持重复值,但鉴于它将列表称为“集合”,我猜这是不允许的:

在DynamoDB中实现这一点的最佳方法是什么

您要查找的是
“L”
数据类型。下面是我使用AWS Java SDK 1.9.3版针对DynamoDBLocal运行的完整示例。立即进行
扫描
,检查表格结果(代码下方的输出)。当使用实际的DynamoDB服务时,应该没有任何不同:

import com.amazonaws.auth.AWSCredentials;
导入com.amazonaws.auth.BasicAWSCredentials;
导入com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
导入com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
导入com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
导入com.amazonaws.services.dynamodbv2.model.AttributeValue;
导入com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
导入com.amazonaws.services.dynamodbv2.model.CreateTableResult;
导入com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
导入com.amazonaws.services.dynamodbv2.model.KeyType;
导入com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
导入com.amazonaws.services.dynamodbv2.model.PutItemRequest;
导入com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
导入com.amazonaws.services.dynamodbv2.model.ScanRequest;
导入com.amazonaws.services.dynamodbv2.model.ScanResult;
导入com.amazonaws.services.dynamodbv2.util.Tables;
导入com.google.common.collect.ImmutableList;
导入java.util.List;
公共类Test28140400{
私有静态最终字符串表\u NAME=“test\u TABLE”;
私有静态最终字符串散列\u密钥\u属性\u NAME=“散列”;
私有静态最终字符串范围\u键\u属性\u NAME=“范围”;
公共静态void main(字符串[]args){
AWSCredentials AWSCredentials=新的基本凭证(“密钥”、“机密”);
AmazonDynamoDB dynamoDB=新的AmazonDynamoDB客户端(awsCredentials);
dynamoDB.setEndpoint(“http://localhost:4000");
if(Tables.doesTableExist(dynamoDB,TABLE_NAME)){
dynamoDB.deleteTable(表名称);
}
CreateTableRequest CreateTableRequest=新建CreateTableRequest();
createTableRequest.setTableName(表名称);
setProvisionedThroughput(新的ProvisionedThroughput(50l,50l));
List keySchema=ImmutableList.builder()
.add(新的KeySchemaElement(HASH_KEY_ATTRIBUTE_NAME,KeyType.HASH))
.add(新的KeySchemaElement(范围\键\属性\名称,KeyType.RANGE))
.build();
setKeySchema(keySchema);
List attributeDefinitions=ImmutableList.builder()
.add(新属性定义(哈希\键\属性\名称,ScalarAttributeType.S))
.add(新属性定义(范围\键\属性\名称,ScalarAttribute Type.N))
.build();
createTableRequest.setAttributeDefinitions(attributeDefinitions);
CreateTableResult CreateTableResult=dynamoDB.createTable(createTableRequest);
Tables.waitForTableToBecomeActive(dynamoDB,TABLE_NAME);
PutItemRequest PutItemRequest=新的PutItemRequest();
putItemRequest.setTableName(表名称);
addItemEntry(散列\键\属性\名称,新的AttributeValue().with(“第一个\散列”);
putItemRequest.addItemEntry(范围\键\属性\名称,新属性值(),带n(“123456789”);
//使用“L”类型
//更好、优秀、最好、重要、好、成功、最好、创造性、强大、效益
列表属性=ImmutableList.builder()
.add(新的AttributeValue().with(“更好”))
.add(新的AttributeValue().with(“优秀”))
.add(新的AttributeValue().with(“最佳”))
.add(新的AttributeValue().with(“重要”))
.add(新的AttributeValue().with(“good”))
.add(新的AttributeValue().with(“成功”))
.add(新的AttributeValue().with(“最佳”))
.add(新的AttributeValue().with(“creative”))
.add(新的AttributeValue().with(“强大”))
.add(新的AttributeValue().with(“优点”))
.build();
putItemRequest.addItemEntry(“random_属性”,new AttributeValue(),withL(attributes));
dynamoDB.putItem(putItemRequest);
扫描结果扫描=dynamoDB.scan(新的扫描请求(表名称));
scan.getItems().forEach(System.out::println);
}
}
输出:

{random_attribute={L:[{S:better,},{S:excellent,},{S:best,},{S: 重要,},{S:good,},{S:success,},{S:best,},{S:creative,}, {S:power,},{S:benefits,}],},范围={N:123456789,},哈希={S: 第一个散列,}


哦,我也试过L型的。。。也不起作用。在一个集合中不能有重复的数据。考虑将它作为逗号分隔的字符串来实现,并有一个编组类来分离它。谢谢迈克。我尝试了“L”类型,并收到一条错误消息