Объедините больше совпадений $ в одном $ или в MongoDB - PullRequest
0 голосов
/ 03 августа 2020

Существует поиск, который отлично работает для одного столбца, и я хочу, чтобы он проверял введенную строку в двух (более) столбцах.

Вот как это работает для одного:

if (req.query.name) {
      aggregateOptions.push({ $match: { name: { $regex: req.query.name, $options: 'i' } } });
}

, поэтому он проверяет, присутствует ли введенная строка / подстрока в столбце name , и отфильтровывает столбцы, в которых его нет.

Я хочу добавить это также для город столбец. Таким образом, он проверяет, присутствует ли введенная строка в одном из столбцов name или city , это не обязательно должно быть в обоих, только в одном это нормально.

Итак, я использовал $or для этого:

if (req.query.name) {
  aggregateOptions.push({
    $or: [
      { $match: { name: { $regex: req.query.name, $options: 'i' } } },
      { $match: { city: { $regex: req.query.city, $options: 'i' } } },
    ],
  });
}

Это кажется неправильным, потому что он ничего не фильтрует, когда строка вводится в поле поиска и возвращает ошибку 400 и "$or is not allowed in this atlas tier".

Как это решить?

1 Ответ

2 голосов
/ 03 августа 2020

Вы очень близки. Но $ or находится на неправильном уровне. Атлас заносит доступные этапы в белый список. Вы получаете эту ошибку, так как вы используете $ или как этап, а это не так.

if (req.query.name) {
  aggregateOptions.push({
    $match: {
      $or: [
        { name: { $regex: req.query.name, $options: 'i' } },
        { city: { $regex: req.query.city, $options: 'i' } },
      ],
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...