У меня есть таблица db Dynamo, где hashKey - это идентификатор пользователя, а ключ диапазона создается метка времени.
У нас есть устаревший код, который создает записи в таблице Dynamo db, и эти данные имеют поле threadId (первичный ключ из устаревшей базы данных).
Иногда (благодаря базовой платформе обмена сообщениями) я получаю записи с повторяющимися идентификаторами потоков, и в этом случае мне нужна только одна запись в производственной базе данных.
Я попытался установить условие следующим образом:
DynamoDBSaveExpression saveExpr = new DynamoDBSaveExpression();
saveExpr.setExpected(new ImmutableMap.Builder()
.put("threadId", new ExpectedAttributeValue()
.withValue(new AttributeValue().withS(record.threadId))
.withComparisonOperator(ComparisonOperator.NE)).build());
mapper.save(record, saveExpr);
Однако это не работает. Я не уверен, но похоже, что если значения userId / created (hash / range key) не идентичны, динамо создает новую запись независимо от выражения сохранения (которое, похоже, не соответствует документации).
Я делаю что-то неправильно? Есть ли способ предотвратить дублирование записи независимо от значений ключей хэша / диапазона?
2 ответа
Чтобы решить эту проблему, мне пришлось сделать следующее:
DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map<String, ExpectedAttributeValue> expectedAttributes =
ImmutableMap.<String, ExpectedAttributeValue>builder()
.put(THREAD_ID, new ExpectedAttributeValue().withExists(false)) //The threadId doesn't exist or is empty
.build();
saveExpression.setExpected(expectedAttributes);
Я думаю ты хочешь
put("threadId", new ExpectedAttributeValue()
.withValue(new AttributeValue().withS(record.threadId))
.withComparisonOperator(ComparisonOperator.NE)).build());
Вместо этого быть:
put("threadId", new ExpectedAttributeValue(false))
Подробнее читайте в блоге AWS
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.