我有这个代码,我想在角色为"COMPANY"时将名称道具转换为唯一的模型道具,但我找不到访问角色值以检查条件的方法。
import mongoose, { Schema } from 'mongoose';
import uniqueValidator from 'mongoose-unique-validator';
import { IUser } from '../interfaces/user';
const validRoles = {
values: ['HUMAN', 'COMPANY', 'RRHH'],
message: '{VALUE} is not a valid role'
}
const UserSchema: Schema = new Schema({
role: { type: String, required: [true, 'Role is required'], enum: validRoles },
name: {
type: String,
required: [true, 'Name is required'],
unique: this.role === 'COMPANY' ? true : false,
},
email: { type: String, required: [true, 'Email is required'], unique: true, uniqueCaseInsensitive: true },
password: { type: String, required: [true, 'Password is required'] }
});
UserSchema.plugin( uniqueValidator, {message: '{PATH} must be unique'});
export default mongoose.model<IUser>('User', UserSchema);
知道吗?
谢谢!
您的代码无法工作有几个原因。
- 您无法访问模态定义中字段的值,因此代码
this.role === 'COMPANY' ? true : false
在无论如何 - 当你在mongoose中定义一个唯一的字段时,它将创建一个索引在该领域,而不是基于条件
您可以做的解决方案:
当你试图违反唯一约束时,你使用的插件只是给你一个很好的错误,而不是MongoDB的E11000错误
我建议您在不使用插件的情况下,在猫鼬中创建部分唯一索引
UserSchema.index({ name: 1 }, {
unique: true,
partialFilterExpression: {
role: { $eq: 'COMPANY' }
}
});
如果需要,处理MongoDB的E11000错误