【问题标题】:How do you update a referenced document in mongoose?你如何更新猫鼬中的参考文档?
【发布时间】:2017-06-24 17:31:39
【问题描述】:

我正在使用 mongoose 和 nodejs 创建一个预订系统。 有一个酒店列表,其中包含可用房间数作为字段。 例如,在为客户创建新预订时,我想通过减少 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'}
}

这是我遇到问题的后期操作:

api.route('/booking').post(function(req,res){
hotel.findOneAndUpdate({id: req.body.hotelId, availableRooms: {$gt: 0}},
availableRooms: -1, function(err){
if (err) throw err})
booking.create(req.body, function(err, confirmedBooking){
if (err) throw err;
res.json(confirmedBooking)
});

邮递员显示此错误:

ReferenceError:酒店未定义

【问题讨论】:

  • 如何在代码中包含Hotel

标签: node.js mongodb mongoose


【解决方案1】:

您的代码中有多个错误:

  1. 您可能没有在节点应用程序 (app.js/server.js) 中导入酒店架构。 来自postmanhotel is undefined 的错误就是因为这个原因。

如果您已经导入,请检查变量名,它们区分大小写,所以也要检查。

在您的节点应用程序中导入酒店架构:

var Hotel = require('path/to/hotel.js');
//OR
var Hotel = mongoose.model('Hotel');

然后尝试使用Hotel 而不是hotel 更新文档。

  1. 你不能像decrease那样使用field的值,你需要使用$inc

试试这个:

var hotelId = mongoose.Schema.Types.ObjectId(req.body.hotelId);
// Dont forget to include mongoose in your app.js
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)
        });
    }
});

更新 :我已经在更新函数的回调中移动了创建新预订的部分,这样只有在成功更新时才会创建新预订。最好用这种方式

【讨论】:

  • 嘿,我按照您的建议进行了必要的更改。程序正在编译。但是,当我现在通过邮递员发送 POST 请求时,它并没有连接到本地主机。它在模型“hotel”的路径“_id”处为值“req.body.hotelId”抛出一个转换为 ObjectId 失败。
  • 你可以console.log(req.body.hotelId) 告诉我接下来会发生什么吗?
  • 请确保 hotelId 在 POST 请求中正确传递。另外,id 应该是_id,请查看更新后的答案。
  • 所以,基本上,我使用 Post 函数在 /hotel 中使用相同的路由器创建了不同的酒店。这些都创造了不同的酒店。我刚刚取出其中一个 ID 并将其放入 post 函数中以创建预订。如果没有更新操作,它会显示我通过的任何内容。有了它,它会抛出与之前相同的错误。
  • 你运行的是哪个版本的 Mongoose?
猜你喜欢
  • 2016-11-02
  • 2015-02-23
  • 2017-05-20
  • 1970-01-01
  • 2011-10-05
  • 2011-10-25
  • 2016-05-24
  • 2016-09-23
  • 1970-01-01
相关资源
最近更新 更多