有没有办法在猫鼬模式中有条件地设置'unique'?



我在实现用户删除功能时遇到了一个问题。

假设我有一个模型:

const UserSchema = new mongoose.Schema(
{
email: { type: String, required: true, unique: true },
name: { type: String, required: true },
password: { type: String, required: true },
deleted: {type: Date, default: null}
},
{ timestamps: true }
);

这清楚地说明了字段email必须是唯一的。但是,我想将其设置为仅在为deleted != null过滤的集合中唯一。

换句话说,我想在检查是否唯一之前过滤掉已删除的用户记录。

这方面有什么最佳实践吗?

或者我应该创建一个名为del-email的字段并将电子邮件字段清空,以避免过度复杂并保留数据?

你可以试试,

带唯一约束的部分索引:

  • 部分唯一索引,可以指定过滤表达式条件,如果匹配则唯一索引承担角色,
UserSchema.index(
{ email: 1 },
{ unique: true, partialFilterExpression: { deleted: { $eq: null } } }
);

注意:如部分索引的查询覆盖文档中所述:

要使用部分索引,查询必须包含过滤器表达式(或指定过滤器表达式子集的修改的过滤器表达式)作为其查询条件的一部分。

User.find({ email: "something@mail.com", deleted: null });

最新更新