Node.js mongoose模式由2个字段唯一

Node.js mongoose模式由2个字段唯一,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我试图将两个字段设置为彼此唯一且没有重复项 代码如下: const Connection = mongoose.model("Connection", new mongoose.Schema({ from_friend: { type: mongoose.Schema.Types.ObjectId, ref: 'Friend' }, to_friend: { type: mongoose.Schema.Types.Objec

我试图将两个字段设置为彼此唯一且没有重复项

代码如下:

const Connection = mongoose.model("Connection", new mongoose.Schema({
    from_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    },
    to_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    }
}))
exports.Connection = Connection;

可以使用包含这两个字段的唯一索引来执行此操作


const ConnectionSchema = mongoose.Schema({
    from_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    },
    to_friend: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Friend'
    }
});

ConnectionSchema.index({ from_friend: 1, to_friend: 1 }, { unique: true });
module.exports = mongoose.model('Connection', ConnectionSchema);

对于初学者来说,一个常见的问题是模式的唯一选项不是验证器。它是构建MongoDB唯一索引的方便助手。有关更多信息,请参阅常见问题解答

从:

我声明一个模式属性是唯一的,但是我仍然可以保存重复的。有什么好处

Mongoose本身不处理unique:
{name:{type:String,unique:true}
只是在name上创建MongoDB唯一索引的简写。例如,如果MongoDB还没有名称的唯一索引,那么下面的代码不会出错,尽管unique为true

var schema=newmongoose.schema({
名称:{type:String,unique:true}
});
var Model=db.Model('Test',schema);
创建([{name:'Val'},{name:'Val'}],函数(err){
console.log(err);//无错误,除非已生成索引
});

但是,如果您等待使用
Model.on('index')
事件生成索引,则尝试保存重复项将正确出错

你需要自己写

如果内置验证器不够,您可以定义自定义验证器以满足您的需要

通过传递验证函数来声明自定义验证。您可以在SchemaType#validate()API文档中找到有关如何执行此操作的详细说明


不起作用,我仍然可以创建重复的对象。我还假设你在第一行是指新的mongoose.Schema。@alexlug现在试试你的答案是好的,但不完整。因为我必须重置数据库。我批准了它。谢谢。不知道你在那里写了什么。。。我是一个新来表达…检查链接。我用他们的话更新了答案。基本上,
unique
不是验证器。它是MongoDB索引的助手。您所追求的是自定义验证逻辑。依赖于
unqiue
是有风险的,因为索引可能在数据进入之前无法设置,因为它们不用于验证。