猫鼬修复了唯一且稀疏且可以采用空值的索引

时间:2018-07-12 03:48:23

标签: node.js mongodb mongoose

我找到的大多数答案都是来自旧帖子,我看到了偏索引,但没有很好的使用示例,而且当我再次启动猫鼬时我也启动了索引,无法找到有关如何将其设置为与之配合使用的示例。部分索引。

// 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

1 个答案:

答案 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)
  }
});