从数据库中过滤数据后如何只显示匹配的结果?

How to show only matched result after filtering data from the database?

我正在 node.js 开发巴士票预订应用程序 在此应用程序中,我创建了不同的 table,如位置 table、路线 table 和其他

我的位置模式是这样的。

const locationSchema = new mongoose.Schema(
  {
    departureLocation: {
      name: {
        type: String,
        required: true,
      },
      time: {
        type: String,
        required: true,
      },
      subLocations: { type: [String] },
    },
    arrivalLocation: {
      name: {
        type: String,
        required: true,
      },
      time: {
        type: String,
        required: true,
      },
      subLocations: { type: [String] },
    },
  },
  {
    timestamps: true,
  }
);

在此 table 中,只有管理员可以输入有关位置的数据。 将数据插入位置 table 后,我的 mongodb 位置 table 看起来像这样。 https://i.stack.imgur.com/Bbt8S.png 输入有关位置的数据后,只有管理员可以添加有关旅行(路线)的数据 路由架构如下所示

const routeSchema = new mongoose.Schema({
  location:{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Location',
    required: true
  },
  duration: {
    type: Number,
    required: true,
  },
  busId:{
    type: mongoose.Schema.Types.ObjectId,
    ref:"Bus",
    required: true
  },
  date: {
    type:String,
    required: true
  },
},
{
  timestamps: true,
});

路线table看起来像这样 https://i.stack.imgur.com/UamRi.png 我将位置 ID table 引用到位置架构

但是问题现在开始了 我只想显示他们在查询字符串中输入的匹配结果,如:(http://127.0.0.1:3000/trips?departure=surat&arrival=bhavnagar&date=2022-05-30) 所有用户(一般用户)但问题是我从数据库中获取所有结果

我的获取请求是这样的:

router.get("/trips", 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;

  const locations = await Location.find({
    'departureLocation.name': departure,
    'arrivalLocation.name': arrival
  })
  
  const routes = await Route.find({
    locations,
    date
  });

  return !routes ? res.status(404).send() : res.status(200).send(routes);
});

我认为它只是解析日期,但它会跳过查询字符串中的其他参数。 我知道代码有问题,但不知道哪里有问题?

您应该使用 Route.find 中的位置 ID 和 $in 运算符,如下所示:

const ids = locations.map(l => l._id);
const routes = await Route.find({
    $and: [
        { location: { $in: ids }},
        { date },
    ]
});

还要确保 Location.find returns 您期望的位置。所以在 Route.find

之前尝试 console.log(locations)