Javascript findByIdAndUpdate$set是否未检查唯一性?
我有一个模式,并指定login is unique为true。当我使用findByIdAndUpdate和pass query$set来更新用户对象时,它在登录为dup时抛出了一个错误。有人知道为什么以及如何更新对象并强制模式验证吗 谢谢Javascript findByIdAndUpdate$set是否未检查唯一性?,javascript,node.js,mongoose,Javascript,Node.js,Mongoose,我有一个模式,并指定login is unique为true。当我使用findByIdAndUpdate和pass query$set来更新用户对象时,它在登录为dup时抛出了一个错误。有人知道为什么以及如何更新对象并强制模式验证吗 谢谢 // UserSchema.js var schema = new Schema({ login: { required: true, unique: true }, password: { index: true,
// UserSchema.js
var schema = new Schema({
login: {
required: true,
unique: true
},
password: {
index: true,
type: String
}
});
// Update
UserSchema.findByIdAndUpdate('someID', { '$set': { login: 'abc' } }, function (error, user) {
callback(error, user);
});
在Mongoose中使用速记助手方法会绕过验证,因此需要使用3步方法:
// 1: Find
UserSchema.findById( 'someID',
function (err, user) {
if(!err){
// 2: Edit
user.login = 'abc';
// 3: Save
user.save(function (err, user) {
if (err) {
console.log(err);
return;
}
console.log('User saved: ' + user);
});
}
}
);
您只需将runValidators设置为true:
findByIdAndUpdate(req.params.id, {$set: data}, {runValidators: true}, function (err, doc) {
if (err) {
// Handle validation errors
}
})
更多信息:Nam,您是否通过JavaScript使用客户端验证来检查重复登录尝试?这需要与服务器进行交互。不是吗?此外,您的问题需要编辑,以便其他人清楚地理解。@Rajesh Paul,我的问题与Node.js和Mongoose.js有关,但与客户端无关。好的,那不是我的问题。没问题@Rajesh Paul,谢谢!您需要在模式中为
login
提供type
值。也许这只是一个输入错误,因为如果您忽略它,Mongoose应该抛出一个异常。这是不正确的,因为在MongoDB中强制执行了unique
索引约束,所以Mongoose自己的验证不涉及其中。@Simon Holmes,它按预期工作。我发现如果我使用findByIdAndUpdate并调用$set或$unset命令,模式验证将不适用。这是一个比公认的更好的答案。在OP的情况下,最好使用$set
更新操作,因为应该对文档进行的唯一更新是在“login”字段上。$set
、$push
、$pull
等的目的是确保我们不会同时发生冲突更新。