【问题标题】:The mongoose findOneAndUpdate function doesn't seem to be working猫鼬 findOneAndUpdate 功能似乎不起作用
【发布时间】:2017-06-24 17:30:59
【问题描述】:

我正在使用 mongoose 和 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。

【问题讨论】:

  • 我猜你是在回调块中创建预订,假设它只会在更新发生时被调用。我猜即使没有更新,也会调用回调并创建您的预订对象。如果 writerresult 确实修改了任何文档,您可以尝试返回带有 err 的 writeresult 对象并创建预订。至于为什么你的酒店文件没有更新,我建议用查询调用 findOne 看看是否真的有匹配的文件。

标签: node.js mongodb mongoose


【解决方案1】:

遍历您的代码,始终执行 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);
            });
        }
    }
);

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多