我在实现用户删除功能时遇到了一个问题。
假设我有一个模型:
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 });