findByIdAndUpdate $ set不检查唯一吗?

时间:2013-09-18 17:00:40

标签: javascript node.js mongoose

我有一个架构并指定login是唯一的。当我使用findByIdAndUpdate并传递查询$ 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);
});

2 个答案:

答案 0 :(得分:2)

您只需将runValidators设置为true:

SELECT ID, CreateDate, KeyValue
FROM (
  SELECT ID, CreateDate, KeyValue,
         ROW_NUMBER() OVER (PARTITION BY KeyValue 
                            ORDER BY CreateDate) AS rn
  FROM capp.dbo.Log
  WHERE Message = 'stat'
        AND OldValue IS NULL
        AND NewValue = 'O'
        AND CreateDate >= '01/01/2016') AS t
WHERE t.rn = 1

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

答案 1 :(得分:1)

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

  1. 查找
  2. 修改
  3. 保存
  4. 例如:

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