You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:25:22