Построение динамического c мон goose запроса на поиск с условной формой поиска - PullRequest
0 голосов
/ 27 апреля 2020

Итак, я пытаюсь создать функцию поиска для моего сайта. Данные хранятся в текстовом поле 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 поля заполнены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...