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
相关产品推荐
相关产品推荐

