我找到的大多数答案都是来自旧帖子,我看到了偏索引,但没有很好的使用示例,而且当我再次启动猫鼬时我也启动了索引,无法找到有关如何将其设置为与之配合使用的示例。部分索引。
// db is read from a config file
mongoose.connect(db.uri, {autoIndex: db.autoIndex, useNewUrlParser: true});
如果我希望像电子邮件这样的属性也是可选的,该属性也是唯一的并且已建立索引,但是当我将其设置更新为null或空白时,即使我强制将其设置为undefined,这也会导致重复错误。
这是我想出的解决方案,但可以用更好的方法解决,这是我简化的模型的全部荣耀
let UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
trim: true,
index: {unique: true, sparse: true}
}
});
// this run when creating a new user
UserSchema.pre('save', function (next) {
if (this.email === null || this.email === '') {
this.email = undefined;
}
next();
});
// this runs when updating a user
UserSchema.pre('update', function () {
const update = this.getUpdate();
let fix = {};
if (update.email === null || update.email === '') {
delete this._update.email;
fix.email = true;
}
this.update({}, {$unset: fix});
});
// Also what about findOneAndUpdate method will I need a pre method too
答案 0 :(得分:1)
深入研究之后,我终于解决了这一问题,使用Partial索引和set函数处理空字符串的情况,这将引发重复错误,因此null对于未定义的值将非常有用,并且将被认为是唯一的
let UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
trim: true,
index: {
unique: true,
partialFilterExpression: {email: {$type: 'string'}},
},
set: v => (v === '' ? null : v)
}
});