У меня есть таблица 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) не идентичны, динамо создает новую запись независимо от выражения сохранения (которое, похоже, не соответствует документации).

Я делаю что-то неправильно? Есть ли способ предотвратить дублирование записи независимо от значений ключей хэша / диапазона?

1
mark 6 Май 2016 в 13:28

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);
0
mark 1 Июн 2016 в 14:06

Я думаю ты хочешь

put("threadId", new ExpectedAttributeValue()
          .withValue(new AttributeValue().withS(record.threadId))
             .withComparisonOperator(ComparisonOperator.NE)).build());

Вместо этого быть:

put("threadId", new ExpectedAttributeValue(false))

Подробнее читайте в блоге AWS

0
rpmartz 8 Май 2016 в 12:07