В моем Node API с MongoDB я добавил функцию поиска, чтобы позволить клиенту искать в коллекции профилей профили других пользователей. В настоящее время моя функциональность поиска принимает в запросе 3 параметра: имя (fn), фамилия (ln) и компания (cp).
Результаты получены по одному параметру или их комбинации 3. На данный момент это точное совпадение, как если бы я искал fn=joe
, я получаю в качестве результата весь профиль с Джо .
Моя цель состоит в том, чтобы иметь возможность найти также запись, такую как J или Jo , потому что во внешнем интерфейсе будет реализована система поиска в реальном времени, поэтому, когда пользователь начинаю печатать результаты, всплывает. Мне нужно изменить свой поиск, чтобы он соответствовал требованиям, но я не очень разбираюсь в Mon go, чтобы сделать это.
Моя функция поиска:
const SearchController = {
async getQuery(req, res) {
try {
// Set
const set = {};
// query params
const { fn, ln, cp } = req.query;
// RexExp to allow upper and lower case in the search
// First name
if (fn) {
set["firstname"] = new RegExp(
"\\b" + req.query.fn + "\\b",
"i"
);
}
// Last name
if (ln) {
set["surname"] = new RegExp("\\b" + req.query.ln + "\\b", "i");
}
// Company
if (cp) {
set["experience.company"] = new RegExp(
"\\b" + req.query.cp + "\\b",
"i"
);
}
//
if (Object.keys(set).length != 0) {
// Searching the profile results
const searchResult = await Profile.find(set, (err, doc) => {
return doc;
});
// No results
if ((await searchResult).length === 0)
throw new ErrorHandlers.ErrorHandler(
404,
`Query do not provided any result`
);
// Response
res.status(200).json(searchResult);
} else {
// No result
throw new ErrorHandlers.ErrorHandler(
404,
"Query do not provided any result"
);
}
} catch (err) {
res.status(500).json({ message: err.message });
}
}
};
URL, который я составляю для поиска:
URL/search?cp=...&fn=...&ln=...
Как уже упоминалось, я могу искать только одну или комбинацию из трех параметры и это не чувствительно к регистру. Я могу использовать G как g.