首页 > 解决方案 > 有没有办法在 Mongoose Schema 中有条件地设置“唯一”?

问题描述

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

假设我有一个模型:

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并将电子邮件字段设为空,以避免过于复杂并保留数据?

标签: mongodbauthenticationmongoose

解决方案


你可以试试,

具有唯一约束的部分索引

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

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

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

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

推荐阅读