如何更新猫鼬中的部分而非全部字段

leo*_*APA 3 mongoose mongodb node.js express

这是用户架构:

var UserSchema = new Schema({
    username: { type: String, required: true, index:{unique: true} },
    firstName: { type: String, required: true },
    lastName: { type: String, required: true },
    email: { type: String, required: true, index:{unique: true} }, 
    password: { type: String, required: true, select: false }
});
Run Code Online (Sandbox Code Playgroud)

这是 http PUT 请求:

  // update user information
  api.put('/users/:username', function(req, res) {

    User.findOne({username: req.params.username}, function(err, user) {

      if (err){
        res.send(err);
        return;
      }

      if (!user){
        res.status(404).send({
          success: false,
          message: "user not found"
        });
      } else {
        user.username = req.body.username;
        user.email = req.body.email;
        user.password = req.body.password;
        user.firstName = req.body.firstName;
        user.lastName = req.body.lastName;

        user.save(function(err) {
          if (err){
            res.send(err);
            return;
          }

          res.json({
            success: true,
            message: "user information updated."
          });
        });
      }
    });
  });
Run Code Online (Sandbox Code Playgroud)

问题是,如果用户只想更新有限的字段,例如只更新用户名,那么上面的代码是行不通的,错误是这样的:

{
  "message": "User validation failed",
  "name": "ValidationError",
  "errors": {
    "lastName": {
      "properties": {
        "type": "required",
        "message": "Path `{PATH}` is required.",
        "path": "lastName"
      },
      "message": "Path `lastName` is required.",
      "name": "ValidatorError",
      "kind": "required",
      "path": "lastName"
    },
    "firstName": {
      "properties": {
        "type": "required",
        "message": "Path `{PATH}` is required.",
        "path": "firstName"
      },
.........
Run Code Online (Sandbox Code Playgroud)

那么我该如何实现以允许用户更新某些字段而不是所有字段?

任何意见和建议表示赞赏!

Moa*_*agi 9

findOneAndUpdate与更新对象中的运算符$set一起使用:

User.findOneAndUpdate({username: req.params.username}, { $set: req.body }, { new: true }, callback);
Run Code Online (Sandbox Code Playgroud)

$set将允许您仅修改req.body对象中提供的字段。


May*_*ita 5

我最终使用了这个解决方案:

const dot = require('dot-object'); // this package works like magic

const updateData = { some: true, fields: true };

User.updateOne(
  { _id: req.user._id },
  { $set: dot.dot(updateData) },
  (err, results) => {
    if (err) res.json({ err: true });
    else res.json({ success: true });
  }
);
Run Code Online (Sandbox Code Playgroud)

我在这里找到了这个想法:https://github.com/Automattic/mongoose/issues/5285#issuecomment-439378282