mongoose findOneAndUpdate函数似乎不起作用

时间:2017-01-27 13:28:58

标签: node.js mongodb mongoose

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

这是我的代码

- 酒店模型文件

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

-Booking Model file

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

这是我遇到问题的代码。

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)
    });
}
});

当我尝试使用邮递员创建新预订时,它会创建新的预订,但它不会检查可用的房间选项。如果酒店的客房数量为零,则仍会继续创建预订。此外,可用房间的数量根本不会低于0。

1 个答案:

答案 0 :(得分:0)

完成代码后, findOneAndUpdate() 回调中的else子句始终会执行,因为您的代码不会产生任何错误,它只是不检查更新查询中有匹配的文档。

您需要检查是否有匹配的文件以及原始文件是否有可用于创建新预订的房间。

以下代码实现了规范:

  

我想检查特定酒店的可用房间数是否大于0

{ '_id': hotelId, 'availableRooms': { '$gt': 0 } },

如果是,

  

通过将酒店减少1来更新酒店的可用客房数量。

{ '$inc': { 'availableRooms': -1 } }, 
  

创建新预订

if (hotel && hotel.availableRooms > 0) { /* create booking */ }

更正

Hotel.findOneAndUpdate(
    { '_id': hotelId, 'availableRooms': { '$gt': 0 } },
    { '$inc': { 'availableRooms': -1 } }, 
    function (err, hotel) {
        if (err) throw err;
        else if (hotel && hotel.availableRooms > 0) {
            booking.create(req.body, function(err, confirmedBooking){
                if (err) throw err;
                res.json(confirmedBooking);
            });
        }
    }
);