Node.js mongoose findOneAndUpdate函数不使用';我好像不工作
我正在使用mongoose和nodejs创建一个预订系统。有一个以可用房间数为字段的酒店列表。在为客户创建新预订时,我想检查特定酒店中的可用房间数是否大于0,如果大于0,则通过将其减少1来更新酒店中的可用房间数 这是我的密码 -酒店模型文件Node.js mongoose findOneAndUpdate函数不使用';我好像不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在使用mongoose和nodejs创建一个预订系统。有一个以可用房间数为字段的酒店列表。在为客户创建新预订时,我想检查特定酒店中的可用房间数是否大于0,如果大于0,则通过将其减少1来更新酒店中的可用房间数 这是我的密码 -酒店模型文件 var hotel: new mongoose.Schema{ name: String, availableRooms: {type: Number, default: 1}} var booking: new mongoose.Schema{ use
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'}
}
-预订模型文件
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)
});
}
});
当我尝试使用postman创建新预订时,它会创建新预订,但不会选中可用房间选项。如果一家酒店没有可用房间,它仍然会继续创建预订。而且,可用房间的数量根本不低于0 检查代码时,始终会执行回调中的
else
子句,因为代码不会产生任何错误,只是不会检查更新查询中是否有匹配的文档
您需要检查是否有匹配的文档,以及原始文档是否有可供您创建新预订的房间
以下代码实现了该规范:
我想检查特定酒店的可用房间数是否大于0
如果是的话
通过减少1,更新酒店中可用房间的数量
创建新预订
正确更新
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);
});
}
}
);
查看代码时,始终会执行回调中的
else
子句,因为代码不会产生任何错误,只是不会检查更新查询中是否有匹配的文档
您需要检查是否有匹配的文档,以及原始文档是否有可供您创建新预订的房间
以下代码实现了该规范:
我想检查特定酒店的可用房间数是否大于0
如果是的话
通过减少1,更新酒店中可用房间的数量
创建新预订
正确更新
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);
});
}
}
);
我猜您是在callback块中创建booking,假设只有在更新发生时才会调用它。我猜即使没有更新,也会调用回调,并创建您的预订对象。如果writeresult确实修改了任何文档,您可以尝试返回带有err的writeresult对象并创建预订。至于为什么你的酒店文档没有得到更新,我建议用查询打电话给findOne,看看是否真的有匹配的文档。我猜你是在回调块中创建预订,假设只有在更新发生时才会调用它。我猜即使没有更新,也会调用回调,并创建您的预订对象。如果writeresult确实修改了任何文档,您可以尝试返回带有err的writeresult对象并创建预订。至于为什么您的酒店文档没有得到更新,我建议致电findOne进行查询,看看是否真的有匹配的文档。