在DynamoDB中能否通过单次调用实现条件Put并返回旧项?
DynamoDB条件Put操作:新增或返回现有项能否单次调用完成?
无法通过单次DynamoDB API调用完全实现你描述的需求,以下是具体分析和可行方案:
你的现有代码问题
你当前使用的带条件表达式的put操作:
await documentClient.put({ TableName: 'table', Item: { userId: 'user0', name: 'smith', }, ConditionExpression: 'attribute_not_exists(userId)', });
当目标userId已存在时,会直接抛出ConditionalCheckFailedException,不会返回任何旧项数据——因为条件不满足时操作直接失败,没有返回值的逻辑。
可行实现方案
虽然无法单次调用完成,但可以通过「尝试插入+异常捕获查询」的方式实现需求,逻辑如下:
- 尝试带条件的
put操作,设置ReturnValues: 'ALL_OLD'(确保插入成功时返回空值,代表是新增项) - 若抛出
ConditionalCheckFailedException,说明用户已存在,此时调用get操作获取旧项
示例代码:
try { const result = await documentClient.put({ TableName: 'table', Item: { userId: 'user0', name: 'smith', }, ConditionExpression: 'attribute_not_exists(userId)', ReturnValues: 'ALL_OLD' }).promise(); // 新增成功,result.Attributes为空 return { isNew: true, item: result.Attributes }; } catch (error) { if (error.name === 'ConditionalCheckFailedException') { // 用户已存在,查询并返回旧项 const getResult = await documentClient.get({ TableName: 'table', Key: { userId: 'user0' } }).promise(); return { isNew: false, item: getResult.Item }; } // 处理其他异常 throw error; }
补充说明
这种方案在用户不存在时仅需1次put调用,存在时需要2次调用(失败的put+get),这是目前DynamoDB生态下最贴合你需求的实现方式——DynamoDB暂未提供单次API调用同时完成「不存在则插入、存在则返回旧项且不修改」的功能。
内容的提问来源于stack exchange,提问作者Sten
相关产品推荐
相关产品推荐

