我正在使用猫鼬和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);
});
}
}
);