我有一个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会创建一个新记录而不管保存表达式(它看起来与文档不匹配)
我做错了吗?有没有办法防止重复记录而不考虑散列/范围键的值?
答案 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);