使用Java WriteRequest无法在DynamoDB中执行Upsert操作
DynamoDB Java客户端Upsert问题解答
首先明确:你当前使用的PutRequest本身就是全量替换式的Upsert——当对应PartitionKey和SortKey的条目存在时,会完全替换整个item;不存在时则新增。如果你的需求就是这种“全量覆盖”的Upsert,那代码没有问题,当前行为是符合预期的。
如果你的需求是仅更新部分字段、保留原有其他字段的Upsert(这可能是你对“Upsert”的预期),那不能用PutRequest,需要改用UpdateRequest,结合UpdateExpression实现:
实现部分更新式Upsert的代码示例
// 构建UpdateRequest,指定要更新的字段和键 UpdateRequest updateRequest = UpdateRequest.builder() // 设置PartitionKey和SortKey .key(Map.of( "partitionKey", AttributeValue.builder().s("你的分区键值").build(), "sortKey", AttributeValue.builder().s("你的排序键值").build() )) // 定义更新表达式:SET指定要更新的字段 .updateExpression("SET #field1 = :val1, #field2 = :val2") // 字段名占位符映射(避免字段名与DynamoDB保留字冲突) .expressionAttributeNames(Map.of( "#field1", "实际字段名1", "#field2", "实际字段名2" )) // 字段值占位符映射 .expressionAttributeValues(Map.of( ":val1", AttributeValue.builder().s("新值1").build(), ":val2", AttributeValue.builder().n("123").build() )) // 可选:若需严格控制仅当item不存在时创建、存在时更新,可添加条件表达式 // .conditionExpression("attribute_not_exists(partitionKey) OR attribute_exists(partitionKey)") .build(); // 包装为WriteRequest WriteRequest writeRequest = WriteRequest.builder() .updateRequest(updateRequest) .build();
说明
- 当目标条目存在时,上述代码只会更新
实际字段名1和实际字段名2,其他原有字段会被保留; - 当目标条目不存在时,DynamoDB会根据
UpdateExpression自动创建新条目,包含指定的字段和值。
内容的提问来源于stack exchange,提问作者Avik Das
相关产品推荐
相关产品推荐

