如何在DynamoDB中仅当PK和SK组合不存在时执行Put操作?
解决DynamoDB联合主键下避免覆盖数据的问题
要在包含PK(分区键)和SK(排序键)的表中避免覆盖特定的PK/SK组合,你需要精准检查数据库中是否已存在该组合的项,而非单独检查属性是否存在。以下是修改后的代码和说明:
修改后的代码示例
let params = { TableName: process.env.NIMS_TABLE_NAME, Item: { ...userObj, PK: userObj.sid, // 替换为你的分区键字段值 SK: userObj.userId // 替换为你的排序键字段值,根据业务实际调整 }, ConditionExpression: "NOT (PK = :pk AND SK = :sk)", ExpressionAttributeValues: { ":pk": userObj.sid, ":sk": userObj.userId } }; try { await docClient.put(params).promise(); return { success: true, sid: userObj.sid, userId: userObj.userId }; } catch (err) { if (err.message === "The conditional request failed") { err.message += ` (Item with PK (${userObj.sid}) and SK (${userObj.userId}) already exists)`; } callback(new Error(`[422] ${err.message}`)); }
关键说明
- ConditionExpression 写法:
NOT (PK = :pk AND SK = :sk)直接检查数据库中是否存在与当前插入的PK、SK值完全匹配的项。只有当该组合不存在时,才会执行put操作,彻底避免覆盖已有数据。 - ExpressionAttributeValues:使用参数绑定的方式传递PK和SK的值,是DynamoDB推荐的规范写法,既能避免语法注入风险,也让代码更具可读性和维护性。
- 错误提示优化:在catch块中更新了错误信息,明确指出是哪个PK/SK组合已存在,便于问题排查。
内容的提问来源于stack exchange,提问作者lowcrawler
相关产品推荐
相关产品推荐

