首页 > 解决方案 > 如何在 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;

标签: node.jsmongodbmongoose

解决方案


已尝试条件查询并修改了您的数组搜索查询以查找公司,

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")

推荐阅读