mongodb - 有没有办法在 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
并将电子邮件字段设为空,以避免过于复杂并保留数据?
解决方案
你可以试试,
- 部分唯一索引,可以指定过滤表达式条件,如果匹配则唯一索引起作用,
UserSchema.index(
{ email: 1 },
{ unique: true, partialFilterExpression: { deleted: { $eq: null } } }
);
注意: 如部分索引的查询覆盖率文档中所述:
要使用部分索引,查询必须包含过滤器表达式(或指定过滤器表达式子集的修改过滤器表达式)作为其查询条件的一部分。User.find({ email: "something@mail.com", deleted: null });
推荐阅读
- python - 熊猫如何用字符串重新采样列
- vba - 访问报告不显示
- c# - TLSharp propper 注销
- excel - 如何在单个文件中隐藏 excel 填充句柄
- reactjs - SpinButton:公共属性 'value' 未定义,公共方法 'focus()' 不是函数
- java - 转换 ArrayList(Hashmap
) 到一些 Arraylists - python - 在 python 中生成一个固定的 alpha + 顺序数值
- javascript - 浏览器中是否存在用于激活的跨浏览器事件?
- php - 如何删除文件中的所有行直到出现特定单词 PHP
- javascript - Vue.js,路由器导入模板vue文件