Как получить только совпадающие данные в node.js с помощью mongoose?

Я создаю приложение для бронирования билетов на автобус в node.js. Я хочу получить только соответствующие данные о запросах, а не все данные. Но я получаю все данные об автобусе.

Вот модель местоположения. Только администратор может вводить данные о местоположении.

const locationSchema = new mongoose.Schema(
  {
    departureLocation: {
      name: {
        type: String,
        required: true,
        lowercase: true
      },
      time: {
        type: String,
        required: true,
      },
      subLocations: { type: [String], lowercase: true },
    },
    arrivalLocation: {
      name: {
        type: String,
        required: true,
        lowercase: true
      },
      time: {
        type: String,
        required: true,
      },
      subLocations: { type: [String], lowercase: true },
    },
  },
  {
    timestamps: true,
  }
);
Войти в полноэкранный режим Выход из полноэкранного режима

Вот таблица маршрутов. Снова администратор…

const routeSchema = new mongoose.Schema({
  location:{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Location',
    required: true
  },
  duration: {
    type: Number,
    required: true
  },
  date: {
    type:String,
    required: true
  },
},
{
  timestamps: true,
});
Войти в полноэкранный режим Выход из полноэкранного режима

Модель автобуса: Админ…

const busSchema = new mongoose.Schema({
    busNumber: {
      type: String,
      unique: true,
      required: true,
    },
    seats: {
      type: Number,
    },
    route: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Route",
      required: true,
    },
  },
  {
    timestamps: true,
  });
Войти в полноэкранный режим Выйти из полноэкранного режима

и, наконец, таблица бронирования:

const bookingSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
    required: true,
  },
  busId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Bus",
    required: true,
  },
  passengers: [
    {
      name: { type: String, required: true, trim: true },
      gender: { type: String, required: true, trim: true },
      age: { type: Number, required: true, trim: true },
    }],
  phone: {
    type: Number,
    required: true,
  },
  email: {
    type: String,
    required: true,
  },
  bookingDate: {
    type: String,
    required: true,
  },
  fare: {
    type: Number,
    required: true,
  },
  seats: {
    required: true,
    type: [Number],
  },
  departureDetails: [
    {
      city: { type: String, required: true, trim: true },
      location: { type: String, required: true, trim: true },
      time: { type: String, required: true, trim: true },
      date: { type: String, required: true, trim: true },
    },
  ],
  arrivalDetails: [
    {
      city: { type: String, required: true, trim: true },
      location: { type: String, required: true, trim: true },
      time: { type: String, required: true, trim: true },
      date: { type: String, required: true, trim: true },
    },
  ],
},{
    timestamps:true
});
Войти в полноэкранный режим Выход из полноэкранного режима

Каждый раз, когда авторизованный пользователь вводит данные бронирования, они сохраняются в базе данных. Никаких проблем.

Теперь я хочу показать каждому пользователю (неавторизованному также) моего приложения о поездках (маршрутах), автобусе, который будет курсировать в этой конкретной поездке, и зарезервированных и свободных местах в этом конкретном автобусе, которые в настоящее время хранятся.

Но проблема в том, что я получаю все автобусы, даже если он не участвует в этой поездке.

Вот запрос:

router.get("/trip/single", async (req, res) => {
  if (!req.query.departure || !req.query.arrival || !req.query.date) {
    return res.send({
      error: "Please enter the data to get the trip",
    });
  }
  const { departure, arrival, date } = req.query;

  let locations = await Location.find({
    'departureLocation.name': departure,
    'arrivalLocation.name': arrival,
  });

  const ids = locations.map(location => location._id)

  const routes = await Route.find({$and: [{location : {$in: ids}},{date}]});
  const route = routes.find(()=>{
    return ([{ date }, { routes }])
  });

  let buses = await Bus.find({})
  let matchedBuses = buses.filter((bus)=> {
    return bus.routes === locations._id
  })

  const bookings = await Booking.find({})
  const busIdWithSeatsObj = {}
  for(let i = 0; i < matchedBuses.length; i++){
    let currentBusSeats = []
    const busBookings = bookings.filter((booking) => {
      return (booking.departureDetails.date === date &&
        booking.busId.toString() === matchedBuses[i]._id.toString()
        )
    })
    busBookings.forEach((booking) => {
      currentBusSeats = [...currentBusSeats, ...booking.seats]
    })
    busIdWithSeatsObj[matchedBuses[i].seats] = currentBusSeats
  }

  res.status(200).send({route, matchedBuses, busIdWithSeatsObj});
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь я также хочу получить данные по Id (только для одного автобуса).

Как это сделать?

Кто-нибудь может мне помочь?

Вот изображение входных данных с результатом для даты: 2022-06-02, которая действительно доступна в базе данных: https://i.stack.imgur.com/FlfaG.png.

Это второй запрос с результатом для даты: 2022-06-01. Он не доступен в базе данных, но все еще показывает совпадающие автобусы: https://i.stack.imgur.com/xY5pW.png Теперь данные о маршруте исчезли, но совпадающие автобусы все еще показываются.

Оцените статью
Procodings.ru
Добавить комментарий