【问题标题】:How to insert an array of ids with create function in node如何在节点中使用create函数插入一个id数组
【发布时间】:2023-02-13 22:57:23
【问题描述】:

我在节点中定义了这个猫鼬模式

`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 });`

旅游参数是一个 id 数组

但我得到这个错误 “预订验证失败:tour.0:投射到 [ObjectId] 失败,因为值“[”5c88fa8cf4afda39709c295a,5c88fa8cf4afda39709c2951”]”(类型字符串)位于路径“tour.0” 如果游览属性不是一组对象,我可以只用一次游览来完成。我的主要问题是预订可能与我数据库中的许多旅游对象相关 *经过一些修改后编辑错误变为 “位置 0 的 JSON 中的意外标记 u”

我的前端代码(角度)是这样的。我正在向我的后端(节点)发出获取请求

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',
  });
});

【问题讨论】:

    标签: arrays object mongoose insert create-function


    【解决方案1】:

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

    当您要创建新的预订文档时。

    场景 1:一次旅行

    • 您只需传递游览的 ID {始终检查游览是否存在},这很明显且简单,同时 mongo 将创建一个引用模型的表,因为 Tour 在您的预订模型中被定义为很多

    场景 2:不止一次旅行

    • 您需要在正文中的数组中定义所有游览的 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}
    }
    

    => 猫鼬中的运算符$push 是您需要推送到现有预订中已有的数组或游览的内容 new_tour 来自你的req.body

    可以肯定的是,在某些情况下,您将从 Booking 中删除 Tour ID,

    => 在这种情况下,您将使用运算符 $pull

    【讨论】:

    • 我认为这就是我现在正在做的事情。 create 函数中的 tour 参数是一个 id 数组。我正在用这段代码创建这个数组 const tour = req.body.map((item) => item.tour.id);但是这个实现产生了我发布的问题。
    • const tour = req.body.map((item) => item.tour.id) 你身体里有地图吗,或者你正在尝试使用地图功能,你能分享代码吗,或者你为什么不映射游览变量 tour.map( ...)
    • 正在编辑我的答案,以使其更加明显
    • 我还编辑了我的问题以澄清一点,很抱歉没有很具体。这是我第一次在这里发帖,我正在努力适应它
    • 你能检查一下吗?我只是创建了一个简单的项目,它与我描述的两个场景相匹配;如果你需要,我会给你 GitHub 仓库
    猜你喜欢
    • 2019-05-16
    • 2021-11-12
    • 2021-07-02
    • 2021-05-07
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多