如何在Dynamodb中通过复合主键更新项目

时间:2015-11-05 07:48:45

标签: amazon-web-services amazon-dynamodb

我有一张叫做朋友的桌子:

Friend 1 | Friend 2 | Status

朋友1是我的HASH属性,朋友2是我的范围属性。

我想更新项目的staus属性,其中friend 1 ='Bob',friend 2 ='Joe'。阅读http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPICRUDExample.html上的文档我只能看到如何用1键更新项目,如何包含其他键?

2 个答案:

答案 0 :(得分:1)

你走了:

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
            .withKeyConditionExpression("Id = :val1 and ReplyDateTime > :val2")
            .withExpressionAttributeValues(
...

其中Id是哈希键,ReplyDateTime是范围键。

参考: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html

答案 1 :(得分:0)

我正在编写一个示例,您可以在其中更新单个表中的多个项目。我将主键作为id和范围键作为Datetime。 实际上在dynamodb中没有可用的功能,所以我在这里做的是首先用哈希键和范围键查询所有变量,我想要更新它。一旦所有数据都存储在List中,然后使用它加载数据的散列键和范围键,并使用set更改或更新字段并保存。 由于我在哈希键中进行编辑,因此我们需要将哈希键原始文件删除。如果您需要更新下一个属性,则无需。我还没有添加删除代码自己编写。您可以查询是否有混淆,您的条目将使用哈希键,并且将添加带有新哈希键的新条目。 代码如下:

public static void main(String[] args) {
    AmazonDynamoDBClient client = new AmazonDynamoDBClient();
    DynamoDBMapper mapper = new DynamoDBMapper(client);
    client.setEndpoint("http://localhost:8000/");
    String fromDate = "2016-01-13";
    String toDate = "2016-02-05";
    User user = new User();
    user.setId("YourHashKey");
    LocalDate frmdate = LocalDate.parse(fromDate, DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDate todate = LocalDate.parse(toDate, DateTimeFormatter.ISO_LOCAL_DATE);
    LocalDateTime startfrm = frmdate.atStartOfDay();
    LocalDateTime endto = todate.atTime(23, 59, 59);
    Condition rangeCondition = new Condition().withComparisonOperator(ComparisonOperator.BETWEEN.toString()).withAttributeValueList(new AttributeValue().withS(startfrm.toString()), new AttributeValue().withS(endto.toString()));
    DynamoDBQueryExpression<User> queryExpression = new DynamoDBQueryExpression<User>().withHashKeyValues(user).withRangeKeyCondition("DATETIME", rangeCondition);
    List<User> latestReplies = mapper.query(User.class, queryExpression);
    for (User in : latestReplies) {
        System.out.println(" Hashid: " + in.getId() + " DateTime: " + in.getDATETIME() + "location:" + in.getLOCID());
        User ma = mapper.load(User.class, in.getId(), in.getDATETIME());
        ma.setLOCID("Ohelig");
        mapper.save(ma);
    }
}