node.js - 如何在 API 中构建搜索端点以从数据库中查找和过滤结果
问题描述
在我的 Node API 和 MongoDB 中,我正在尝试构建一个端点来搜索数据库中的数据并将结果返回给客户端。我的搜索目标是显示来自 Profile 集合的结果,通过这种方式,我可以构建查询以按名字、姓氏、公司及其组合作为示例进行搜索:
GET search?fn=joe or ?ln=doe or ?cp=Company or ?fn=...&ln=...&cp=...
实际上,我可以以不同的方式进行搜索,例如,我可以通过搜索获得为公司工作的所有人。
我想了解如何使用 Mongoose/MongoDB 实现这一目标,并为即将到来的结果添加可选的限制/分页到查询中。
我试图进行一些简单的试验,但我被卡住了,因为我真的不明白下一步如何进行。
const SearchController = {
async getQuery(req, res) {
try {
const { fn, ln, cp } = req.query;
const searchResult = await Profile.find({
$or: [
{ firstname: fn },
{ surname: ln },
{
experience: {
company: cp
}
}
]
});
res.status(200).json(searchResult);
} catch (err) {
res.status(500).json({ message: err.message });
}
}
};
配置文件的 JSON:
{
"imageUrl": "https://i.pravatar.cc/300",
"posts": [
"5e3cacb751f4675e099cd043",
"5e3cacbf51f4675e099cd045",
"5e3cacc551f4675e099cd046"
],
"_id": "5e2c98fc3d785252ce5b5693",
"firstname": "Jakos",
"surname": "Lemi",
"email": "lemi@email.com",
"bio": "My bio bio",
"title": "Senior IT developer",
"area": "Copenhagen",
"username": "Jakos",
"experience": [
{
"image": "https://via.placeholder.com/150",
"createdAt": "2020-02-04T13:47:37.167Z",
"updatedAt": "2020-02-04T13:47:37.167Z",
"_id": "5e3975f95fbeec9095ff3d2f",
"role": "Developer",
"company": "Google",
"startDate": "2018-11-09T23:00:00.000Z",
"endDate": "2019-01-05T23:00:00.000Z",
"area": "Copenhagen"
},
{
"image": "https://via.placeholder.com/150",
"createdAt": "2020-02-04T13:59:27.412Z",
"updatedAt": "2020-02-04T13:59:27.412Z",
"_id": "5e3978bf5e399698e20c56d4",
"role": "Developer",
"company": "IBM",
"startDate": "2018-11-09T23:00:00.000Z",
"endDate": "2019-01-05T23:00:00.000Z",
"area": "Copenhagen"
},
{
"image": "https://via.placeholder.com/150",
"createdAt": "2020-02-07T16:35:43.754Z",
"updatedAt": "2020-02-07T16:35:43.754Z",
"_id": "5e3d91dfb3a7610ec6ad8ee3",
"role": "Developer",
"company": "IBM",
"startDate": "2018-11-10T00:00:00.000Z",
"endDate": "2019-01-06T00:00:00.000Z",
"area": "Copenhagen"
}
],
"createdAt": "2020-01-25T19:37:32.727Z",
"updatedAt": "2020-02-04T23:14:37.122Z",
"__v": 0
}
预期的结果是,例如,如果我搜索名字 Joe,我应该返回所有名字为 Joe 的个人资料。姓氏和公司类似。
请提供评论以让我了解您是否需要原始代码中的更多脚本才能查看。
EDITED 添加了搜索修改的代码
// Models
const { Profile } = require("../models");
// Error handling
const { ErrorHandlers } = require("../utilities");
const SearchController = {
async getQuery(req, res) {
try {
const { fn, ln, cp } = req.query;
const query = {
$or: []
};
if (fn) query.$or.push({ firstname: fn });
if (ln) query.$or.push({ surname: ln });
if (cp) query.$or.push({ "experience.company": cp });
const searchResult = Profile.find(query, docs => {
return docs
});
if ((await searchResult).length === 0)
throw new ErrorHandlers.ErrorHandler(
404,
"Query do not provided any result"
);
res.status(200).json(searchResult);
} catch (err) {
res.status(500).json({ message: err.message });
}
}
};
module.exports = SearchController;
解决方案
已尝试条件查询并修改了您的数组搜索查询以查找公司,
function findUser(fn, ln, cp) {
const query = {
$or: []
}
if (fn) query.$or.push({ firstname: fn })
if (ln) query.$or.push({ surname: ln })
if (cp) query.$or.push({ "experience.company": cp })
Profile.find(query, function (err, docs) {
if (err) {
console.error(err);
} else {
console.log(docs);
}
});
}
findUser("","","IBM")
推荐阅读
- c# - How to upload more than 4MB in c# using Microsoft Graph API rest calls
- macos - 如何在 macOS 上释放 os_log_create() 返回的 os_log_t 类型?
- groovy - Groovy String 数组排序使用浮点值
- dependency-injection - 如何将路径配置从另一个服务注入到 ServeStaticModule 中?
- lua - 解码 Roblox 后门
- tapestry - 是否可以使用带有区域的页面链接
- ruby-on-rails - 如何仅使用正则表达式接受双“”
- unity3d - Unity Copy Movement base off faces
- ruby-on-rails - Ruby-ReviewsController#index 中的 NoMethodError
- go - 无限循环变量:在无限循环中创建一个数组会浪费内存吗?