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

Mongoose insertMany()是否支持MongoDB5改进版Schema校验错误格式

Mongoose insertMany 不返回MongoDB 5.0新版Schema校验错误的问题说明

正如官方文档所述,调用model.create()方法时可正常获取MongoDB 5.0提供的改进版Schema校验错误信息,但调用model.insertMany()时返回的错误仍为旧格式,核心疑问为insertMany方法目前是否尚未支持该改进错误格式?

运行环境

mongodb 5.0.6
mongoose 6.2.4
node v16.14.1

集合Schema配置

{
  "$jsonSchema": {
    "bsonType": "object",
    "additionalProperties": false,
    "required": [
      "name"
    ],
    "properties": {
      "_id": {
        "bsonType": "objectId"
      },
      "name": {
        "bsonType": "string"
      }
    }
  }
}

触发错误的测试脚本

const mongoose = require("mongoose");

main().catch((err) => {
  console.log('error: ', JSON.stringify(err, null, 4));
  process.exit(1);
});

async function main() {
  await mongoose.connect("mongodb://localhost:27017/t12");

  const schema = new mongoose.Schema({ name: String, value: String });
  const model = mongoose.model("tests", schema);

  let res;
  res = await model.insertMany([{value: 'hello'}], { rawResult: true, ordered: false });
  console.log('insert: ', res);
  process.exit(0);
}

实际返回的错误内容

{
    "code": 121,
    "writeErrors": [
        {
            "code": 121,
            "index": 0,
            "errmsg": "Document failed validation",
            "op": {
                "value": "hello",
                "_id": "62c5ae93986f65769edc60e7",
                "__v": 0
            }
        }
    ],
    "result": {
        "ok": 1,
        "writeErrors": [
            {
                "code": 121,
                "index": 0,
                "errmsg": "Document failed validation",
                "op": {
                    "value": "hello",
                    "_id": "62c5ae93986f65769edc60e7",
                    "__v": 0
                }
            }
        ],
        "writeConcernErrors": [],
        "insertedIds": [
            {
                "index": 0,
                "_id": "62c5ae93986f65769edc60e7"
            }
        ],
        "nInserted": 0,
        "nUpserted": 0,
        "nMatched": 0,
        "nModified": 0,
        "nRemoved": 0,
        "upserted": []
    },
    "insertedDocs": []
}
问题解答

该问题和MongoDB 5.0本身的能力无关,根源是当前使用的Mongoose 6.2.4版本对insertMany的错误处理逻辑存在适配缺失:

  • model.create()的内部逻辑已经完成适配,会自动解析MongoDB 5.0返回的新版校验错误中携带的详细失败原因,包括缺失必填字段、字段类型不匹配、触发额外属性拦截等具体信息,格式化后返回给调用方。
  • 6.2.4版本的insertMany没有同步实现这层错误解析逻辑,仅透传了批量写入接口返回的外层错误结构,没有提取错误对象中存储详细信息的errInfo字段,因此只能看到笼统的Document failed validation提示,无法获取具体的校验失败详情。

可选择两种方式解决:

  • 不升级版本的临时方案:拿到insertMany抛出的错误后,手动遍历writeErrors数组,读取每个错误项上的errInfo属性即可。MongoDB 5.0实际已经把完整的结构化校验错误信息存储在该字段中,只是Mongoose没有主动提取展示。
  • 永久修复方案:将Mongoose升级到6.4.0及以上版本,官方已经在该版本补全了insertMany对MongoDB 5.0新版Schema校验错误的解析逻辑,升级后insertMany返回的错误格式和create方法保持一致,无需手动解析字段。

注意:如果调用insertMany时传入了rawResult: true参数,返回结果会保留MongoDB驱动返回的原始结构,这种场景下需要自行从原始结果的错误项中读取详细校验信息。


内容的提问来源于stack exchange,提问作者Chandana Kithalagama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:33:20