如果req.query.key为空,如何在db.find()方法中忽略它并返回所有文档



我有两个来自pug模板的req.query参数:req.query.cityreq.query.key

form.paieskaPagalRaktiniZodi(action='/search?' method='GET')
label(for='paieskaPagalRaktiniZodi') Key Word:
br
input#key(type='text' name='key')
br
label(for='city') City:
br
input#city(type='text' name='city')
br
button(type='submit' value='Submit' )

我想在我的DB上运行find方法,并查找包含给定值的文档,但问题是,如果我不在pug输入中插入任何内容,我会得到空字符串。如果我用空字符串运行find方法,我会得到0个结果。如果给定的查询为空,是否可以忽略find设置?

现在我用if's检查传入查询:

exports.filtruotiSkelbimai = catchAsync(async (req, res, next) => {
const keyName = req.query.key;
const cityName = req.query.city;
console.log(keyName);
let skelbimai;
if (keyName.length === 0) {
const skelbimaiSelected = await Skelbimai.find({
miestas: req.query.city,
});
skelbimai = skelbimaiSelected;
}
if (cityName.length === 0) {
const skelbimaiSelected = await Skelbimai.find({
$text: { $search: req.query.key },
});
skelbimai = skelbimaiSelected;
}
if (cityName.length > 0 && keyName.length > 0) {
const skelbimaiSelected = await Skelbimai.find({
$text: { $search: req.query.key },
miestas: req.query.city,
});
skelbimai = skelbimaiSelected;
}
if (keyName.length === 0 && cityName.length === 0) {
skelbimai = await Skelbimai.find();
}
res.status(201).render("overview", {
title: "Skelbimai",
skelbimai,
});
});

有可能做这样的吗

exports.filtruotiSkelbimai = catchAsync(async (req, res, next) => {
const keyName = req.query.key;
const cityName = req.query.city;
const skelbimai = await Skelbimai.find({
miestas: req.query.city,
$text: { $search: req.query.key },
});
res.status(201).render("overview", {
title: "Skelbimai",
skelbimai,
});
});

但是,如果任何给定的查询为空,则忽略该查询?如果两者都为空,则忽略它们,只需运行db.find()并返回所有文档。

尝试使用$或运算符执行此操作,但如果同时指示req.query.keyreq.query.city,则它仅按关键字返回文档,而忽略城市。

您可以使用排列运算符以更干净的方式应用过滤器:

exports.filtruotiSkelbimai = catchAsync(async (req, res, next) => {
const keyName = req.query.key;
const cityName = req.query.city;
let filters = {};
if (cityName.length > 0) {
filters = {
...filters,
miestas: cityName,
};
}
if (keyName.length > 0) {
filters = {
...filters,
$text: { $search: keyName },
};
}
const skelbimai = await Skelbimai.find(filters);
res.status(201).render("overview", {
title: "Skelbimai",
skelbimai,
});
});

最新更新