mongoose 如何使用create函数在节点中插入一个id数组

kiayqfof  于 2023-02-16  发布在  Go
关注(0)|答案(1)|浏览(124)

我已经在节点中定义了这个mongoose模式

`const bookingSchema = new mongoose.Schema({
  tour: [
    {
      type: mongoose.Schema.ObjectId,
      ref: 'Tour',
      required: [true, 'Booking must belong to Tours!'],
    },
  ],
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: [true, 'Booking must belong to User!'],
  },
  price: {
    type: Number,
    required: [true, 'Booking must have a price'],
  },
  createdAt: {
    type: Date,
    default: Date.now(),
  },
  paid: {
    type: Boolean,
    default: true,
  },
});
bookingSchema.pre(/^find/, function (next) {
  this.populate('user').populate({
    path: 'tour',
    select: 'name',
  });`your text`
});

Then when i try to create a booking i use the create function 
await Booking.create({ tour, user, price });`

tour参数是一个id数组
但我得到这个错误“预订验证失败:行程0:对于值“[“5c88fa8cf4afda39709c295a,强制转换为[对象ID]失败,5c88fa8cf4afda39709c2951”]”(类型字符串)在路径“tour.0”如果tour属性不是一个对象数组,我可以只对一个tour执行此操作。我的主要问题是,一个预订可能与我的数据库中的许多tour对象相关 * 在进行一些修改后编辑,错误变为“JSON中位置0处的意外标记u”
我的前端代码(角)是这样的。我正在向我的后端(节点)发出一个get请求

createBookingCheckout(params: any): Observable<any> {
    console.log('serv');
    return this.http.get<any>(`${CREATE_BOOKING_CHECKOUT}`, {
      params,
      withCredentials: true,
    });
  }

所以我把id作为查询参数传递
这是我尝试创建预订的后端

exports.createBookingCheckout = catchAsync(async (req, res, next) => {
  const { order, tour: strTour } = req.query;
  const user = req.user._id;
  const parsedOrder = JSON.parse(order);
  const tour = JSON.parse(strTour);
  console.log(tour);
  // const tours = await tour.forEach((id) => {
  //   Tour.find({ id });
  // });
  // console.log(tours);

  let price = 0;
  parsedOrder.forEach(
    (obj) => (price = price + obj.price_data.unit_amount * obj.quantity)
  );
  if (!parsedOrder && !user) return next();
  await Booking.create({ tour, user, price });
  res.redirect(req.originalUrl.split('?')[0]);
  res.status(200).json({
    status: 'success',
  });
});
yvfmudvl

yvfmudvl1#

我认为这个问题的快速解决方案是,每当您要添加多个旅游时,您应该创建一个数组,将所有图尔斯ID推送到数组中,然后将tourArray添加到您要创建的新预订中,当您要更新现有预订时,您应该重复此过程。
当您要创建新的预订文档时。

情况一:参加一次旅游

  • 您只需传递旅行的id {始终检查旅行是否存在},这是显而易见且简单的,同时mongo将创建一个引用模型的表,因为旅行在预订模型中定义为多个
    情况二:参加多个巡回赛
  • 您需要在主体内的数组中定义所有Tour的ID
{
    "tour": [ "id-1", "id-2", ...]
}

更新预订

假设您要向现有预订添加新的旅行,

Booking.findByIdAndUpdate(
        {_id: id},
        {
         // ! here all your other data

            $push: {tour: new_tour}
        },
// this is just to return the updated booking
        {new: true, runValidators: true}
}

=〉mongoose中的运算符$push是您需要推送到您现有预订中已有的现有数组或游览中的运算符new_tour来自您的req.body
当然,在某些情况下,您将从Booking中删除Tour ID,
=〉在这种情况下,您将使用运算符$pull

相关问题