我在一个名为“个人档案”的集合中有个人档案。我正在查询以根据用户搜索配置文件提供的字段。在搜索表单(UI表单)时,用户可以选择不同的选项来搜索“女性”或“男性”或“任何”等配置文件,然后单击“搜索”按钮。这样,用户可以通过提供以下字段的组合来搜索我的收藏个人资料。
因此,例如,用户选择以下字段:性别:“女性”,国家/地区:“巴基斯坦”,城市:“伊斯兰堡”,婚姻状况:“任何”,教育程度:“任何”,宗教信仰:“伊斯兰”,那么您将选择什么查询MongoDB吗?
我需要对所有情况进行动态查询。
我到目前为止尝试过:
Profile.find(
{
gender: req.body.gender,
country: req.body.country,
city: req.body.city,
maritalStatus: req.body.maritalStatus,
education: req.body.education,
religion: req.body.religion
},
{},
function(err, profiles){
if(profiles!=null)
{ res.status(200).json({status: true, message:'Profile(s) found', profiles})}
else
{res.status(404).json({status: false, message:'No profile(s) found.'})}
}
);
但以上查询并非在所有情况下都是动态的。
仅提取req.body
对象中存在的字段并将其添加到对象中。该对象将用于过滤查询结果
const filter = Object.entries(req.body)
.reduce((acc, curr) => (acc[curr[0]] = curr[1], acc), {});
最后,您将有一个filter
对象,该对象仅包含用户选择的那些属性。您可以在查询中传递此过滤器对象
Profile.find(filter, {}, function(err, profiles) {
if(profiles!=null)
return res.status(200).json({status: true, message:'Profile(s) found', profiles});
res.status(404).json({status: false, message:'No profile(s) found.'});
});