如何在mongoose中更新引用的文档?

时间:2017-01-26 17:08:52

标签: node.js mongodb mongoose

我正在使用mongoose和nodejs创建各种预订系统。 有一个酒店列表,其中有许多可用的房间作为一个领域。 在为客户创建新预订时,我想通过将其减少1来更新酒店的可用房间数量。

这是我的代码:

酒店模特档案:

var hotel: new mongoose.Schema{
name: String, 
availableRooms: {type: Number, default: 1}}

预订模型文件:

var booking: new mongoose.Schema{
userName: String,
hotelId: {type: Schema.Types.ObjectId, ref: 'hotel'}
}

这是我遇到问题的后期操作:

api.route('/booking').post(function(req,res){
hotel.findOneAndUpdate({id: req.body.hotelId, availableRooms: {$gt: 0}},
availableRooms: -1, function(err){
if (err) throw err})
booking.create(req.body, function(err, confirmedBooking){
if (err) throw err;
res.json(confirmedBooking)
});

邮差显示此错误:

ReferenceError:未定义酒店

1 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误:

  1. 您可能没有在节点应用程序(app.js / server.js)中导入酒店架构。 postman hotel is undefined的错误即将发生。
  2. 如果您已导入,请检查变量名称,它们区分大小写,因此请检查。

    要在节点应用中导入酒店架构:

    var Hotel = require('path/to/hotel.js');
    //OR
    var Hotel = mongoose.model('Hotel');
    

    然后尝试使用Hotel而不是hotel更新文档。

    1. 你不能decrease这样field的价值,你需要使用$inc
    2. 试试这个:

      var hotelId = mongoose.Schema.Types.ObjectId(req.body.hotelId);
      // Dont forget to include mongoose in your app.js
      Hotel.findOneAndUpdate({
          _id: hotelId, availableRooms: {$gt: 0}
      },{
          $inc : { availableRooms : -1 }
      }, function(err){
          if (err) throw err
          else
          {
              booking.create(req.body, function(err, confirmedBooking){
                  if (err) throw err;
                  res.json(confirmedBooking)
              });
          }
      });
      

      更新:我已将该部分移至更新功能回调中创建新预订,以便仅在成功更新后才会创建新预订。用这种方式最好