Итак, я пытаюсь создать функцию поиска для моего сайта. Данные хранятся в текстовом поле player1, player2, char1, char2 и игровое поле в базе данных. В настоящее время у меня есть форма поиска, в которой я могу ввести имя в любое из этих 5 полей и выполнить поиск и получить данные; не все поля должны быть заполнены для поиска. Я хочу включить его, чтобы, если у меня есть имя в поле ввода player1 или player2, оно выполняло поиск этого имени в записи player1 и player2 в базе данных.
Можно ли как-нибудь сконструировать этот запрос поиска, чтобы он был динамическим c, поэтому, если в поле char1 нет данных, у него не будет $ или оператора, проверяющего char1?
VideoModel.find({
$and: [
{ $or: [{player1: player1}, {player2: player1}] },
{ $or: [{player2: player2}, {player1: player2}] },
{ $or: [{char1: char1}, {char2: char1}] },
{ $or: [{char2: char2}, {char1: char2}] },
{ game: game.toUpperCase() }
]
},
В настоящее время я использую эту функцию поиска, чтобы проанализировать строку запроса и затем отправить ее в функцию поиска.
const searchVideos = (request, response) => {
const req = request;
const res = response;
const params = {};
// check if the params exist
const {
player1, player2, char1, char2, game,
} = req.query;
if (player1) params.player1 = `${player1}`;
if (player2) params.player2 = `${player2}`;
if (char1) params.char1 = `${char1}`;
if (char2) params.char2 = `${char2}`;
if (game) params.game = `${game}`.toUpperCase();
return Video.VideoModel.findSearch(params, (err, docs) => {
if (err) {
console.log(err);
return res.status(400).json({ error: 'An error occured' });
}
return res.json({ videos: docs });
});
};
VideoSchema.statics.findSearch = (search, callback) => VideoModel.find(search).select('player1 player2 char1 char2 game link').lean().exec(callback);
Другой альтернативой было бы иметь значение для {char1:}, которое я мог бы вставить и вернуть все результаты, где есть запись. Таким образом, я мог бы жестко запрограммировать поиск и по-прежнему правильно возвращать данные, когда в форме поиска только 1 или 2 поля заполнены.