Mongoose自定义字符串类型_id关联已存在文档触发ID不存在报错如何解决
问题原因
你遇到的报错是mongoose-id-validator插件的默认校验逻辑和自定义字符串_id的配置不匹配导致的,Mongoose本身完全支持自定义字符串类型的_id,没有额外限制。
该插件默认会假设所有关联引用的_id都是MongoDB默认的ObjectId类型,会自动校验传入的关联值是否符合ObjectId格式,同时你配置的refConditions也会增加校验匹配条件,两个地方只要有一个不满足就会触发「引用ID不存在」的报错。
解决步骤
1. 调整mongoose-id-validator插件配置,适配字符串类型_id
在两个Schema注册插件时,增加配置关闭默认的ObjectId格式校验、允许字符串类型的ID引用:
首先调整Integration的Schema插件配置:
const mongoose = require('mongoose'); const { ObjectID } = require('mongodb'); const idValidator = require('mongoose-id-validator'); const integrationSchema = mongoose.Schema( { _id: { type: String, required: true, unique: true, }, name: { type: String, required: true, }, provider: { type: String, required: true, }, active: { type: Boolean, required: true, } }) // 修改插件注册逻辑,新增适配配置 integrationSchema.plugin(idValidator, { validateObjectId: false, // 关闭默认的ObjectId格式校验 allowStringIds: true // 允许字符串类型作为ID }); const IntegrationSchema = mongoose.model('Integration', integrationSchema);
再调整Source的Schema插件配置:
const mongoose = require('mongoose'); const { ObjectID } = require('mongodb'); const idValidator = require('mongoose-id-validator'); const sourceSchema = mongoose.Schema({ integration: { type: String, required: true, ref: 'Integration', refConditions: { active: true, }, }, type: { type: String, required: true, }, }); // 修改插件注册逻辑,新增适配配置 sourceSchema.plugin(idValidator, { validateObjectId: false, allowStringIds: true }); const SourceSchema = mongoose.model('Source', sourceSchema);
2. 确认refConditions匹配规则
你在integration关联字段中配置了refConditions: { active: true },插件校验时只会匹配active字段值为true的Integration文档,如果你要关联的Integration文档active为false,哪怕_id存在也会触发报错,请确认对应文档的active字段值符合要求。
3. 校验关联ID的传入逻辑
创建Source文档时,传入的integration字段值必须和Integration文档的_id完全一致,注意大小写、前后空格等字符串匹配问题。
内容的提问来源于stack exchange,提问作者Mr.J
相关产品推荐
相关产品推荐

