Java DynamoDB——仅在键不存在时插入(不带映射器)

Java DynamoDB——仅在键不存在时插入(不带映射器),java,amazon-dynamodb,Java,Amazon Dynamodb,我只想在密钥不存在时插入此行。如果键已经存在,我不想覆盖该行 我的语法是: new PutItemRequest().withTableName(myTableName).withItem(myItem).withConditionExpression(?) 根据,我会使用类似于attribute\u NOT\u EXISTS的东西。我还可以使用ComparisonOperator.NULL等,这是我所能理解的 语法提示?使用ConditionExpression机制对此进行一些解释?文档中说

我只想在密钥不存在时插入此行。如果键已经存在,我不想覆盖该行

我的语法是:

new PutItemRequest().withTableName(myTableName).withItem(myItem).withConditionExpression(?)
根据,我会使用类似于attribute\u NOT\u EXISTS的东西。我还可以使用ComparisonOperator.NULL等,这是我所能理解的


语法提示?使用ConditionExpression机制对此进行一些解释?

文档中说
ConditionExpression
取代了传统的
ConditionalOperator
.NULL
)。您可以选择两种路由,但应该使用
.withConditionExpression(…)
而不是操作数路由

对于更复杂的表达式,也存在一些限制

但在你的情况下,它应该通过写作来起作用

.withConditionExpression("attribute_not_exists(thingId)")
假设哈希键属性名为
thingId
。该方法也记录在此处:

要防止新项替换现有项,请使用包含属性_not_exists函数的条件表达式,该属性的名称用作表的哈希键。由于每个记录都必须包含该属性,因此只有在不存在匹配项的情况下,attribute_not_exists函数才会成功


我们可以将Dynamo Db主键定义为(分区键和排序键)的组合。基于此假设,此代码将丢弃重复记录

PrimaryKey primaryKey = new PrimaryKey();
primaryKey.addComponent("Partition_Key", partitionId);
primaryKey.addComponent("Sort_Key",sortId);

    Item item = new Item().withPrimaryKey(primaryKey).withString("username", userName).withLong("time", time);

    try {

        PutItemSpec putItemSpec = new PutItemSpec().withItem(item).withConditionExpression("attribute_not_exists(Sort_Key)");
        table.putItem(putItemSpec);

    } catch(ConditionalCheckFailedException ex) {
         logger.error("Record already exists in Dynamo DB Table ");

    }