我有一个架构。唯一的处方是唯一性验证。
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谓词来排除查询中当前doc的_id字段。
答案 0 :(得分: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);
}
}
}