Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在API中构建搜索端点以查找和筛选数据库中的结果_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 如何在API中构建搜索端点以查找和筛选数据库中的结果

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实现这一

在我的节点API和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)中,这样我就可以查看修改后的代码如何调用导出的函数了;