Как обновить элемент по составному первичному ключу в Dynamodb

У меня есть таблица друзей:

Friend 1 | Friend 2 | Status

Друг 1 - это мой атрибут HASH, а Друг 2 - мой атрибут диапазона.

Я хотел бы обновить атрибут статуса элемента, где друг 1 = «Боб», а друг 2 = «Джо». Чтение документации на http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPICRUDExample.html Я вижу только, как обновить элемент с помощью одного ключа, как мне включить другой ключ?


person user2924127    schedule 05.11.2015    source источник


Ответы (2)


Ну вот:

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

person Nick    schedule 11.02.2016

Я пишу пример, в котором вы можете обновить несколько элементов в одной таблице. У меня есть первичный ключ как идентификатор и ключ диапазона как 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);
    }
}
person Yanish Pradhananga    schedule 10.02.2016