猫鼬模式由2个字段唯一

时间:2020-05-04 16:36:33

标签: node.js mongodb express mongoose

我试图将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;

2 个答案:

答案 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)

The unique Option is Not a Validator

对于初学者来说,常见的陷阱是模式的唯一选项不是验证器。它是构建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文档中找到有关如何执行此操作的详细说明。

相关问题