Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose findOneAndUpdate函数不使用';我好像不工作_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js mongoose findOneAndUpdate函数不使用';我好像不工作

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

我正在使用mongoose和nodejs创建一个预订系统。有一个以可用房间数为字段的酒店列表。在为客户创建新预订时,我想检查特定酒店中的可用房间数是否大于0,如果大于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'}
}
-预订模型文件

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进行查询,看看是否真的有匹配的文档。