【问题标题】:findByIdAndUpdate $set does not check for unique?findByIdAndUpdate $set 不检查唯一性?
【发布时间】:2016-03-16 00:12:51
【问题描述】:

我有一个架构并指定登录是唯一的,这是真的。当我使用 findByIdAndUpdate 并传递查询 $set 来更新用户对象时,它确实 not 在登录时抛出错误。有谁知道我为什么以及如何更新对象并强制模式验证?

谢谢!

// 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);
});

【问题讨论】:

  • Nam,您是否通过 JavaScript 使用客户端验证来检查重复登录尝试?这需要与服务器交互。不是吗?此外,您的问题需要编辑才能让其他人清楚地理解。
  • @Rajesh Paul,我的问题与 Node.js 和 Mongoose.js 有关,但与客户端无关。
  • 好的,那它不是我的区域。
  • 没问题@Rajesh Paul,谢谢!
  • 您需要在架构中为 login 提供 type 值。也许这只是一个错字,因为如果你把它排除在外,Mongoose 应该会抛出异常。

标签: javascript node.js mongoose


【解决方案1】:

您只需将 runValidators 设置为 true:

findByIdAndUpdate(req.params.id, {$set: data}, {runValidators: true}, function (err, doc) {
    if (err) {
        // Handle validation errors
    }
})

更多:http://mongoosejs.com/docs/api.html#findOneAndUpdate

【讨论】:

  • 这是一个比接受的更好的答案。在 OP 的情况下,最好使用 $set 更新操作,因为应该在“登录”字段上对文档进行唯一更新。 $set$push$pull 等的目的是确保我们不会同时发生冲突更新。
【解决方案2】:

在 Mongoose 中使用速记辅助方法绕过验证,因此您需要使用 3 步方法:

  1. 查找
  2. 编辑
  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);
      });
    }
  }
);  

【讨论】:

  • 这是不正确的,因为 unique 索引约束在 MongoDB 中强制执行,因此不涉及 Mongoose 自己的验证。
  • @Simon Holmes,它按预期工作。我发现如果我使用 findByIdAndUpdate 并调用 $set 或 $unset 命令,架构验证将不适用。
猜你喜欢
  • 2018-09-24
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多