【问题标题】:dynamodb mapper, how to prevent duplicate records irrespective of the hash/range keysdynamodb 映射器,无论哈希/范围键如何,如何防止重复记录
【发布时间】:2016-05-06 10:28:47
【问题描述】:

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

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

有时(感谢底层消息传递平台)我会得到具有重复 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(散列/范围键)值不相同,dynamo 会创建一个新记录,而不管保存表达式(这似乎与文档不匹配)。

我做错了吗?不管哈希/范围键的值如何,有没有办法防止重复记录?

【问题讨论】:

    标签: java amazon-dynamodb


    【解决方案1】:

    我想你想要

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

    改为:

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

    更多详情请关注AWS Blog

    【讨论】:

    • 抱歉耽搁了,这很接近 - 我会在下面发布答案。
    • @Peavers 从去年 6 月就开始了?
    【解决方案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);
    

    【讨论】:

    • 我认为保存表达式仅适用于键,在您的示例中 THREAD_ID 是哈希键还是范围键?
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多