Как построить конечную точку поиска в API для поиска и фильтрации результатов из базы данных - PullRequest
0 голосов
/ 09 февраля 2020

В моем 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
}

Ожидаемые результаты, например, если я найду имя Джо, я должен вернуть все профили с именем Джо. Аналогично для фамилии и компании.

Пожалуйста, предоставьте комментарии, чтобы я мог понять, если вам нужно больше скриптов из исходного кода, чтобы увидеть.

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;

1 Ответ

0 голосов
/ 09 февраля 2020

Попробовал условный запрос и изменил поисковый запрос в массиве для поиска компании,

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...