如何确认MongoDB事务中的所有CRUD操作都执行成功?
Node.js MongoDB 事务CRUD操作结果校验方案
你遇到的data.result.ok恒为1的问题,本质是该字段仅表示MongoDB服务端成功接收并执行了命令,无系统级错误(比如语法错误、权限错误、网络错误),和业务层面是否匹配到目标文档、是否完成预期数据修改无关。
正确校验实现逻辑
所有MongoDB Node.js驱动的写操作都会返回对应操作的统计结果对象,你可以在事务回调中拿到每个操作的返回值做业务校验,校验不通过时主动抛出错误,withTransaction会自动回滚整个事务,不会提交修改。
修改后的代码示例
execTransaction(session => { return async () => { // 接收updateOne返回的操作结果 const updateResult = await db.collection('table1').updateOne( { username: username }, { $push: { apps: client_id } }, { session } ); // 校验是否匹配到目标用户,未匹配则抛出错误终止事务 if (updateResult.matchedCount === 0) { throw new Error('目标用户不存在,update操作未执行'); } // 可选:如需确认数据实际发生变更,可追加modifiedCount校验 // if (updateResult.modifiedCount === 0) { // throw new Error('用户数据无变更,update操作未生效'); // } // 接收insertOne返回的操作结果 const insertResult = await db.collection('table2').insertOne( { data: data }, { session } ); // 校验插入是否成功 if (!insertResult.insertedId) { throw new Error('table2数据插入失败'); } }; }, data => { console.log('事务提交成功', data); });
不同写操作的常用校验字段参考
updateOne/updateManymatchedCount:匹配到的文档数量,用于判断是否找到符合条件的目标数据modifiedCount:实际发生修改的文档数量,用于判断是否有数据变更
insertOne/insertManyinsertedId(单条插入场景):插入成功生成的唯一_id,非空即为插入成功insertedCount(批量插入场景):实际插入的文档数量
deleteOne/deleteManydeletedCount:实际删除的文档数量
findOneAndUpdate/findOneAndDelete- 返回的文档非空则表示匹配到目标数据
内容的提问来源于stack exchange,提问作者oscxc
相关产品推荐
相关产品推荐

