我试图将2个字段设置为彼此唯一,并且没有重复项。
代码是这样的:
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;
答案 0 :(得分:1)
您可以使用包含两个字段的唯一索引来完成此操作
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);
答案 1 :(得分:0)
对于初学者来说,常见的陷阱是模式的唯一选项不是验证器。它是构建MongoDB唯一索引的便捷助手。有关更多信息,请参见FAQ。
从FAQ:
问:问。我将架构属性声明为唯一,但是我仍然可以保存重复项。有什么作用?A。 Mongoose不能单独处理唯一性:
{ name: { type: String, unique: true } }
只是在名称上创建MongoDB唯一索引的简写。例如,如果MongoDB在名称上还没有唯一索引,则即使唯一身份为true,以下代码也不会出错。
var schema = new mongoose.Schema({ name: { type: String, unique: true } }); var Model = db.model('Test', schema); Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) { console.log(err); // No error, unless index was already built });
但是,如果您等待使用
Model.on('index')
事件建立索引,则尝试保存重复项将正确地出错。
您将需要编写自己的custom validator。
如果内置验证器不够用,您可以定义自定义验证器来满足您的需求。
通过传递验证函数来声明自定义验证。您可以在SchemaType#validate()API文档中找到有关如何执行此操作的详细说明。