猫鼬不保存对文档的更改

时间:2018-10-31 13:19:24

标签: javascript node.js mongodb mongoose

很抱歉,如果这可能是一个重复的问题,但我很难理解猫鼬。
我正在研究实现Mongoose和MongoDB的Node.js项目。我要完成的是通过来自特定端点的呼叫来修改和保存一些用户的数据。
猫鼬模式看起来像这样

  var UserSchema = new Schema({
  isAdmin: {type: Boolean, default: false},
  name: String,
  surname: String,
  nickname: { type: String },
  email: { type: String, lowercase: true, required: true, trim: true, unique: true, dropDubs: true },
  password: { type: String, required: true },
  salt: { type: String },
  verified: { type: Boolean, default: false },
  bio: {
    type: { type: String, enum: [0,1] }, // 0='Appassionato', 1='Giocatore'
    birthday: String,
    height: Number,
    number: Number,
    role: { type: String, enum: [0,1,2,3] }, // 0='Playmaker', 1='Ala', 2='Guardia', 3='Centro'
    team: String,
    city: String,
    aboutMe: String,
  },
  newsletter: {type: Boolean, default: false},
  lastCheckin: {type: mongoose.Schema.Types.ObjectId, ref: 'Checkin'},
  follows: [{type: mongoose.Schema.Types.ObjectId, ref: 'Structure'}],
  score: { type: Number, default: 0 },
  profilePicture: String,
  lastLogin: {type: Date},
  facebook: {
    id: String,
    accessToken: String,
    profileImage : String
  }
}, {
  collection: 'users',
  retainKeyOrder: true,
  timestamps: true,
}).plugin(mongoosePaginate);

以下是端点被询问时的代码

exports.updateUser = (req,res)  => {
  var userId = req.params.userId;
  var updates = req.body;

  User.findOneAndUpdate({_id: userId}, {$set: updates}, (err, saved) => {
    if (!err) {
      console.log("Ritorno questo: " + saved);
      return res.status(202).json(saved);
    } else {
      return res.status(500).json(saved);
    }
  });

};

据我了解,Mongoose公开的方法findOneAndUpdate应该找到我要查找的文档,然后对其进行修改并保存。不过这不会发生。
通过PostMan,我正在发送此JSON

{"bio.aboutMe":"Hello this is just a brief description about me"}

但是PostMan用未修改的对象响应。我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

您需要做的是添加{new:true},它会带给您更新的文档。 在documentation中:

  

如果我们确实需要在应用程序中返回的文档,则有   另一个通常更好的选择:

> Tank.findByIdAndUpdate(id, { $set: { size: 'large' }}, { new: true },
> function (err, tank) {   if (err) return handleError(err);  
> res.send(tank); });

这是我真正不喜欢的东西,因为如果我们不想获取文档,则有另一个选择→更新

所以您需要做的是:

User.findOneAndUpdate({_id: userId}, {$set: updates}, {new:true}.....