Node.js 删除DynamoDB含code属性记录触发ConditionalCheckFailedException
错误产生原因
你遇到的ConditionalCheckFailedException错误由两个核心原因导致:
- 当前你写的删除请求仅指定了固定主键
"email": "email",只会尝试删除主键为email="email"的单条记录,不会遍历全表处理其他记录,只要该条记录不满足条件就会直接抛出错误。 - DynamoDB 不存在
undefined数据类型,你写入记录时如果给code字段传了undefined,DynamoDB 会直接忽略该字段,不会写入到记录中,所以attribute_exists(code)的条件判断对这类记录会返回false,自然触发条件不通过的报错。
实现删除所有含code属性记录的方案
你需要先全表扫描筛选出所有存在code属性的记录,再批量删除符合条件的记录,Node.js 环境下的实现代码如下:
const AWS = require('aws-sdk'); // 初始化DynamoDB客户端,提前配置好AK/SK/区域 const dynamodb = new AWS.DynamoDB.DocumentClient(); const tableName = '替换为你的表名'; // 第一步:扫描全表筛选所有存在code属性的记录 async function getItemsWithCode() { const params = { TableName: tableName, FilterExpression: 'attribute_exists(code)' }; let allItems = []; let scanResult; // 处理分页,避免单次扫描返回数据不全 do { scanResult = await dynamodb.scan(params).promise(); allItems = allItems.concat(scanResult.Items); params.ExclusiveStartKey = scanResult.LastEvaluatedKey; } while (scanResult.LastEvaluatedKey); return allItems; } // 第二步:批量删除筛选出的记录 async function deleteTargetItems(items) { // DynamoDB批量写单次最多处理25条请求,需要拆分批次 for (let i = 0; i < items.length; i += 25) { const batchItems = items.slice(i, i + 25); const deleteRequests = batchItems.map(item => ({ DeleteRequest: { Key: { // 如果你表有排序键,需要在这里补充排序键字段 email: item.email } } })); await dynamodb.batchWrite({ RequestItems: { [tableName]: deleteRequests } }).promise(); } } // 执行任务 async function runTask() { const targetItems = await getItemsWithCode(); console.log(`共找到${targetItems.length}条需要删除的记录`); await deleteTargetItems(targetItems); console.log('所有符合条件的记录删除完成'); } runTask().catch(err => console.error('操作出错:', err));
注意事项
- 如果表数据量很大,全表扫描会消耗较多读容量,建议在业务低峰期操作,也可以给
scan操作增加Limit参数控制扫描速度,避免触发限流。 - 如果你的表除了分区键
email外还有排序键,删除时的Key需要同时传入分区键和排序键的值,否则会删除失败。
内容的提问来源于stack exchange,提问作者Kaguei Nakueka
相关产品推荐
相关产品推荐

