0

我有一个架构。而唯一的处方,是唯一性验证。

User.path("email").validate(hasUnique("email"), "uniqueness");

hasUnique返回将用于mongoose验证值的唯一性的函数。

function hasUnique(key) {
  return function(value, respond) {
    var query = {};
    query[key] = /A regex used to look up the email/;

    User.findOne(query, function(err, user) {
      respond(!user);
    }
  }
}

这在创建新文档时效果很好。但是当我查询一个文档,改变一个属性然后调用save时,这个验证被调用并且失败,因为它在集合中看到了它自己的电子邮件并且认为这不是唯一的。

有没有办法可以在从返回的验证函数中排除文档本身hasUnique?我的想法是我可以添加一个 $not 谓词来排除查询中当前文档的 _id 字段。

4

1 回答 1

1

在 Mongoose 验证函数中,this是否正在验证文档。

所以你可以这样做:

function hasUnique(key) {
  return function(value, respond) {
    var query = { _id: { $ne: this._id }};
    query[key] = /A regex used to look up the email/;

    User.findOne(query, function(err, user) {
      respond(!user);
    }
  }
}
于 2013-07-06T23:03:17.690 回答