从数据库中过滤数据后如何只显示匹配的结果?
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)
我正在 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)