Mongoose findOneAndUpdate和runValidators无法正常工作

Jdr*_*uwe 25 validation mongoose mongodb node.js

我在尝试使用'runValidators'选项时遇到问题.我的用户架构有一个必须设置为true的电子邮件字段,但每次将新用户添加到数据库(使用'upsert'选项)并且电子邮件字段为空时它不会抱怨:

 var userSchema = new mongoose.Schema({
   facebookId: {type: Number, required: true},
   activated: {type: Boolean, required: true, default: false},
   email: {type: String, required: true}
});
Run Code Online (Sandbox Code Playgroud)

findOneAndUpdate 码:

model.user.user.findOneAndUpdate(
      {facebookId: request.params.facebookId},
      {
          $setOnInsert: {
              facebookId: request.params.facebookId,
              email: request.payload.email,
          }
      },
      {upsert: true, 
       new: true, 
       runValidators: true, 
       setDefaultsOnInsert: true
      }, function (err, user) {
          if (err) {
              console.log(err);
              return reply(boom.badRequest(authError));
          }
          return reply(user);
      });
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么,我只是按照文档:http://mongoosejs.com/docs/validation.html

在文档中说如下:

请注意,在mongoose 4.x中,更新验证程序仅在$ set和$ unset操作上运行.例如,无论number的值如何,以下更新都将成功.

我用$ set替换了$ setOnInsert,但结果相同.

kmc*_*rry 7

当您尝试显式$取消设置密钥时,必需的验证程序才会失败.

这对我没有意义,但这是文档所说的.


Isa*_*Pak 5

使用这个插件: mongoose-unique-validator

使用类似方法时,findOneAndUpdate您需要传递此配置对象:

{ 运行验证器:真,上下文:'查询'}

IE。

User.findOneAndUpdate(
  { email: 'old-email@example.com' },
  { email: 'new-email@example.com' },
  { runValidators: true, context: 'query' },
  function(err) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)


yoj*_*jna 4

在猫鼬中分两步做同样的事情。

  1. 使用方法求出结果findOne()
  2. 添加字段并使用 保存文档Model.save()

这将更新您的文档。