Mongoose 默认带 findOneAndUpdate

los*_*ion 0 mongoose mongodb node.js

我有以下架构:

var UserSchema = new Schema({
  username: { type: String, required: true, unique: true },
  displayName: { type: String, required: true },
  registered: { type: Boolean, required: true, default: false }
});
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用 findOneAndUpdate 插入和对象:

  var user = {
    displayName: "Test User"
  }

  User.findOneAndUpdate({username: "test"}, user, {new: true, upsert: true}, function(err, newUser) {
    callback(err, newUser);
  });
Run Code Online (Sandbox Code Playgroud)

用户被正确创建(在第一次尝试时,因为它不存在)。但是,注册字段不会设置为 false。当我执行 findOneAndUpdate 时会发生这种情况吗?

mongo 查询的结果:

> db.users.find().pretty()
{
    "_id" : ObjectId("56255f415641ace1204de658"),
    "username" : "Test",
    "displayName" : "Test User"
}
Run Code Online (Sandbox Code Playgroud)

los*_*ion 8

在猫鼬文档中找到了这个:

findAndModify 助手支持有限的默认值和验证。您可以通过分别设置 setDefaultsOnInsert 和 runValidators 选项来启用这些。

以防其他人遇到这种情况。

 var user = {
    displayName: "Test User"
  }

  User.findOneAndUpdate({username: "test"}, user, {setDefaultsOnInsert: true, new: true, upsert: true}, function(err, newUser) {
    callback(err, newUser);
  });
Run Code Online (Sandbox Code Playgroud)