我正在使用猫鼬和nodejs创建各种各样的预订系统。有一些酒店,其中列出了可提供客房数量的字段。在为客户创建新预订时,我要检查特定酒店中的可用客房数量是否大于0,如果是,请通过将其减少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'}
}


这是我遇到麻烦的代码。

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。

最佳答案

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

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

以下代码实现了该规范:


  我要检查特定酒店的可用客房数量是否大于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);
            });
        }
    }
);

09-05 12:17