Javascript findByIdAndUpdate$set是否未检查唯一性?

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,

我有一个模式,并指定login is unique为true。当我使用findByIdAndUpdate和pass query$set来更新用户对象时,它在登录为dup时抛出了一个错误。有人知道为什么以及如何更新对象并强制模式验证吗

谢谢

// 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
    等的目的是确保我们不会同时发生冲突更新。