Node.js 如何在API中构建搜索端点以查找和筛选数据库中的结果
在我的节点API和MongoDB中,我试图构建一个端点来搜索数据库中的数据,并将结果返回给客户端。我的搜索目标是显示配置文件集合的结果,这样,我可以构建查询,以按姓名、姓氏、公司及其组合进行搜索,例如:Node.js 如何在API中构建搜索端点以查找和筛选数据库中的结果,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,在我的节点API和MongoDB中,我试图构建一个端点来搜索数据库中的数据,并将结果返回给客户端。我的搜索目标是显示配置文件集合的结果,这样,我可以构建查询,以按姓名、姓氏、公司及其组合进行搜索,例如: GET search?fn=joe or ?ln=doe or ?cp=Company or ?fn=...&ln=...&cp=... 实际上,我可以用不同的方式搜索,例如,通过搜索,我可以找到为一家公司工作的所有人 我想了解如何使用Mongoose/MongoDB实现这一
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的所有个人资料。姓氏和公司相似
请提供注释,让我了解您是否需要从原始代码中查看更多脚本
已编辑添加了搜索的已修改代码
// 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")
您是否可以提供更多的配置文件,并删除不必要的数据
fn、ln、cp
将始终具有值或可以是未定义的?因此,我们的想法是使用三个值的组合进行搜索。在我看来,它们总是有价值的,因为必须创建一个配置文件来使用这些价值。我必须以不同的方式搜索,而不仅仅是公司。顺便说一句,尝试你的方式会给出错误{“消息”:“将循环结构转换为JSON \n-->从具有构造函数'NativeTopology'的对象开始\n |属性's'->具有构造函数'object'的对象\n |属性'sessionPool'->具有构造函数'ServerSessionPool'的对象\n--属性'topology'关闭循环”}您可以将当前代码放入route router.get(“/”,SearchCtrl.getQuery)中,这样我就可以查看修改后的代码如何调用导出的函数了;