如何将条件过滤应用于MongoDB文档



我很难弄清楚如何将多级过滤应用于我的mongoDB文档(不确定这个措辞是否正确(。我正在尝试创建一个应用程序,允许用户执行搜索并仅检索那些与他们选择应用的筛选器匹配的文档。用户可以选择只应用一个筛选器或组合多个筛选器。

例如,用户可能正在寻找房子。可用的过滤器可以是位置、大小和类型。如果用户应用了值为"London"的位置过滤器,则他们应该只获得伦敦可用的房屋。如果他们选择将上述位置与值为"两居室公寓"的类型过滤器相结合,他们应该可以获得伦敦所有的两居室公寓。

如何确保根据用户应用的筛选器对结果进行有条件的筛选?我想我应该使用$match,但我不明白我是否可以使用多个查询。

到目前为止,我想到了以下内容:

const getFilteredData = async(req, res) => {
try {
const { filter1, filter2, filter3 } = req.query;
const filteredData = await dataModel.aggregate([
{$match:{
$and:[{filter1:filter1},{filter2: filter2}, {filter3:filter3}]    //1st option: all of the filters are applied by the user
}}
])
res.status(201).json({data: filteredData});
}
catch(err) {
res.status(404).json({message: err.message});
}
}

使用上面的代码,只有在应用所有3个过滤器时,才会对结果进行过滤。我如何满足用户应用的过滤器的不同组合(只有一个过滤器,过滤器1和过滤器3组合等(?

任何帮助都将不胜感激。

假设req.query可以是{name: "Coat", city: "Athens"},您可以执行以下操作:

const getFilteredData = async(req, res) => {
try {
const filtersArr = [];
for (const filterKey of ['name', 'city', 'category']) {
if (req.query[filterKey]) {
const thisFilter = {};
thisFilter[filterKey] = req.query[filterKey];
filtersArr.push(thisFilter);
}
}
console.log(filtersArr)
const filteredData = await filteredDataModel.aggregate([
{$match:{
$and: filtersArr    //1st option: all of the filters are applied by the user
}}
])
res.status(201).json({data: filteredData});
}
catch(err) {
res.status(404).json({message: err.message});
}
}

您也可以像这样使用原始req.query:

const filteredData = await filteredDataModel.find(req.query)

但是使用代码进行迭代可以验证您想要的密钥。。。

最新更新