【问题标题】:Update fields of Mongoose document object from request body从请求正文更新 Mongoose 文档对象的字段
【发布时间】:2016-04-30 05:39:37
【问题描述】:

问题(Mongoose save all parameters from request body) 展示了如何在一行代码中创建带有请求正文的新猫鼬文档对象。
扩展这个问题,我想知道如何一次设置猫鼬文档对象的所有字段。

router.route('/car')
.put(function(req, res, next) {
  Car.findById(req.params.id, function (err, car) {
    if (err) {
      res.status(400).send(err);
    } else {
      if (!car)
        return next(new Error('Failed to load car: ' + req.params.id));

      car.name = req.body.name; // Code refactoring required
      car.seats = req.body.seats;
      car.engine_size = req.body.engine_size; 

      car.save(function(err) {
          if(err)
            res.status(400).send(err);
          else
            res.json(car);
      });
    }
  });
});

在创建文档时var car = new Car(req.body); 是从请求正文中填充字段的完美方法。
对于更新现有的猫鼬文档,有没有比下面几行更好的方法

car.name = req.body.name;
car.seats = req.body.seats;
car.engine_size = req.body.engine_size; 

【问题讨论】:

    标签: node.js mongoose express-4


    【解决方案1】:

    您应该使用更新而不是查找。

    router.route('/car')
    .put(function(req, res, next) {
      Car.update({ _id: mongoose.Types.ObjectId(req.params.id) },req.body)
        .then(function (success) {
          res.json();
        })
        .catch(function (error) {
            res.status(404).send(err);
        });
    });
    

    【讨论】:

    【解决方案2】:

    您可以使用Document.set()

    car.set(req.body)
    try {
        await car.save()                  
    }catch(err){ 
        console.error(e)
    }
    

    【讨论】:

      【解决方案3】:

      为了更新现有的猫鼬文档,有没有比下面几行更好的方法?

      为了更好地利用网络数据和性能,您应该记住,update() 方法更新现有文档中的值,而 save() 方法用 save() 方法中传递的文档替换现有文档。

      因此,如果您的模型很大并且您只想更新少数几个字段,那么更新是更好的选择。

      希望这会有所帮助。

      【讨论】:

      • 据我所知,save() 首先在文档的当前状态和数据库状态之间进行差异,并且只发送差异。 save() 不会完全替换对象。考虑到文档存在于数据库中,这里的区别在于 save() 要求您首先从数据库中请求文档,而 update() 则不需要。换句话说 - save() 是客户端操作,而 update() 是服务器端。
      猜你喜欢
      • 2019-02-26
      • 1970-01-01
      • 2018-10-09
      • 2017-03-07
      • 1970-01-01
      • 2011-10-17
      • 2018-06-05
      • 2020-11-19
      • 2018-06-20
      相关资源
      最近更新 更多