dynamodb mapper,如何防止重复记录,而不管散列/范围键

时间:2016-05-06 10:28:47

标签: java amazon-dynamodb

我有一个dynamo db表,其中hashKey是userId,范围键是创建的时间戳。

我们有一些遗留代码在dynamo db表中创建记录,并且该数据有一个字段threadId(来自遗留数据库的主键)。

偶尔(感谢底层的消息传递平台)我会得到带有重复的threadIds的记录,在这种情况下,我只想在生产数据库中有一条记录。

我已尝试设置如下条件:

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(散列/范围键)值不相同,dynamo会创建一个新记录而不管保存表达式(它看起来与文档不匹配)

我做错了吗?有没有办法防止重复记录而不考虑散列/范围键的值?

2 个答案:

答案 0 :(得分:0)

我想你想要

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

代替:

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

有关AWS Blog

的更多详情

答案 1 :(得分:0)

我必须执行以下操作来解决此问题:

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);