Поиск регулярных выражений Mongodb, но не все документы

Я пытаюсь найти строку в своей коллекции ниже

      {
        question: "What is your least favorite thing about living in the USA?",
        description: "aaaa"
    },
    {
        question: "What is the saddest thing a casino dealer has seen at their table?",
        description: "bbbb"
    }

Я смог сделать это, используя

db.questions.aggregate(
   [
     { $match: { question_title: { $regex: 'what', $options: "i" } }
   ]
)

и я получил оба документа. Однако, когда я использую ключевое слово

'what USA'

Никакого результата не получаю. Мой ожидаемый результат

"What is your least favorite thing about living in the USA?"

Можете ли вы предложить мне регулярное выражение, которое я могу использовать, чтобы получать результат, если какое-либо из моих ключевых слов совпадает с документом с вопросом?

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать что-то вроде этого:

db.questions.aggregate([
    { $match: { question: { $regex: '(?i)(:s|usa|what)', $options: "i" } } }
])

Это совпадение (?i) без учета регистра, которое в настоящее время ищет либо usa, либо what.

Можно поиграйте с regEx подробнее здесь

Для ключевого слова, скажем, у меня есть значение const keyword = 'test' в nodeJS, могу ли я ввести вот так $ regex: '(? I) (: s | keyword |)', потому что ключевое слово - это ввод от пользователя

KevinVuD 10.08.2018 08:31

да, это идея ... у вас получится { $regex: '(?i)(:s|test)', $options: "i" }

Akrion 10.08.2018 08:33

В NodeJS я не могу заставить его работать с вводом от пользователя. Он работает, если я помещаю $ regex: '(? I) (: s | usa | what)', но если я вставляю переменную ключевого слова, такую ​​как var keyword = userInput и $ regex: '(? I) (: s | userInput ) ', mongoDB не распознает. Вы знаете, как решить эту проблему?

KevinVuD 10.08.2018 08:38
$regex: '(?i)(:s|' + userInput + ')' или, если вы можете использовать шаблонный литерал $regex: (?i)(:s|${userInput}). Вам нужно в основном объединить части строк и переменную
Akrion 10.08.2018 08:48

Понятно! Большое спасибо!

KevinVuD 10.08.2018 08:51

Динамическое регулярное выражение:

1.Это регулярное выражение не соответствует точным словам, возвращая результат для 'ua what':

var searchString = 'usa what';
    var regexStr = '(?i)(:s|' + searchString.split(' ').join('|')+')';
    db.getCollection('searchQuestion').aggregate(
       [
         { $match: { question: { $regex: regexStr, $options: "i" } } },

       ]
    );

2.Для точного совпадения слов.

Пример :

var searchStringg = 'usa what';
 var regexStrr = '\\b' + searchStringg.split(' ').join('\\b|\\b')+'\\b';
db.getCollection('searchQuestion').aggregate(
   [
     { $match: { question: { $regex: regexStrr, $options: "i" } } },

   ]
)

Поскольку у нас есть $ options: "i", нам все еще нужно (? I)

KevinVuD 10.08.2018 09:26

Другие вопросы по теме