DynamoDB执行更新查询后,如何返回所有属性及值至JSON响应?
问题解决:DynamoDB事务更新后返回完整数据
为什么拿不到更新后的属性?
DynamoDB的transactWrite事务写入不支持返回更新后的项目数据,哪怕你在Update块里加了ReturnValues: 'ALL_NEW',这个参数在事务操作里会被直接忽略。另外你的代码还有两个小问题:
UpdateExpression里写了:count但没在ExpressionAttributeValues里定义,正确的自减写法应该是SET #count = #count - :valueKey对象末尾缺了逗号,会触发语法错误
两种解决办法
办法1:事务成功后查一次数据
事务执行完,立刻调用getItem查询这条数据,把查询结果返回给前端。
修正后的完整代码:
let response: object; try { // 执行事务更新 await dynamoDB.transactWrite({ TransactItems: [ { Update: { ConditionExpression: "#count > 0", ExpressionAttributeNames: { "#count": "count" }, ExpressionAttributeValues: { ":value": 1, }, Key: { id: '777-000', }, TableName: "Items", UpdateExpression: "SET #count = #count - :value" } } ], }).promise(); // 查询更新后的完整数据 const queryResult = await dynamoDB.getItem({ Key: { id: '777-000' }, TableName: "Items" }).promise(); // 组装响应 response = { statusCode: 200, body: JSON.stringify({ Items: queryResult.Item }) }; } catch(error) { response = { statusCode: 500, body: JSON.stringify({ message: error.message }) }; }
办法2:不用事务,直接用updateItem
如果你的更新操作不需要同时执行多个写入(也就是不需要事务的场景),直接用updateItem方法,这时ReturnValues: 'ALL_NEW'会生效,直接返回更新后的完整属性。
代码示例:
let response: object; try { const updateResult = await dynamoDB.updateItem({ ConditionExpression: "#count > 0", ExpressionAttributeNames: { "#count": "count" }, ExpressionAttributeValues: { ":value": 1, }, Key: { id: '777-000', }, TableName: "Items", UpdateExpression: "SET #count = #count - :value", ReturnValues: 'ALL_NEW' }).promise(); response = { statusCode: 200, body: JSON.stringify({ Items: updateResult.Attributes }) }; } catch(error) { response = { statusCode: 500, body: JSON.stringify({ message: error.message }) }; }
额外说明
- 办法1里,事务和查询之间有极短的时间差,如果有其他请求同时修改这条数据,查询结果可能不是刚更新的状态,但大部分业务场景下这个影响可以忽略。
- 如果必须保证拿到的是事务更新后的准确数据,同时又必须用事务,那就只能用办法1,因为DynamoDB本身不支持事务返回修改后的数据。
内容的提问来源于stack exchange,提问作者thumalee
相关产品推荐
相关产品推荐

