如何在mongoose bulkWrite抛出错误时获取正确执行结果?
Mongoose bulkWrite 出错时获取已执行结果的方案
你说设置{ ordered: false }没解决问题,其实这个参数是让MongoDB继续执行后续操作而非中途停住,而且抛出的错误对象里就藏着已完成的操作统计——只是你没从错误对象里取出来而已。
核心解决思路:从catch的错误对象里挖结果
当bulkWrite在ordered: false模式下报错时,抛出的MongoBulkWriteError错误对象会自带一个result属性,里面包含已完成的nModified、nUpserted这些统计数据,还有每个操作的详细结果。
改一下你的代码就能拿到:
try { let data = [{ ...some_data}, { ...some_data}, {...some_data}] let updateOps = data.map((item) => { return { updateOne: { filter: { some_field: item.some_field }, update: item, upsert: true, }, } }) const result = await model.bulkWrite(updateOps, { ordered: false } ) console.log("所有操作执行成功:", result) } catch (e) { // 批量写入错误里包含已执行的结果 if (e.name === 'MongoBulkWriteError') { console.log("已完成的操作统计:", e.result) console.log("失败操作的详情:", e.result.writeErrors) console.log("已修改文档数:", e.result.nModified) console.log("已插入(upsert)文档数:", e.result.nUpserted) } else { // 处理其他类型的错误 console.error("非批量写入错误:", e) } }
要注意的几个点
- 必须开
ordered: false:这个参数是前提,不然MongoDB碰到第一个错误就停了,后续操作都不执行,自然拿不到更多已完成的结果。 - 识别
MongoBulkWriteError:通过错误名称判断,确保你处理的是批量写入的专属错误,避免和其他错误混在一起。 - 错误对象的
result属性:这个结构和成功时返回的result几乎一样,既有整体统计数,也有每个失败操作的具体原因,方便你排查问题。
额外小技巧
要是你需要逐个追踪操作的成败,可以遍历e.result.writeErrors数组,里面每个元素都记录了失败操作的索引和错误原因,结合统计数就能清楚知道哪些成了哪些没成。
内容的提问来源于stack exchange,提问作者cucumber
相关产品推荐
相关产品推荐

