Я пытаюсь найти строку в своей коллекции ниже
{
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?"
Можете ли вы предложить мне регулярное выражение, которое я могу использовать, чтобы получать результат, если какое-либо из моих ключевых слов совпадает с документом с вопросом?
Вы можете использовать что-то вроде этого:
db.questions.aggregate([
{ $match: { question: { $regex: '(?i)(:s|usa|what)', $options: "i" } } }
])
Это совпадение (?i)
без учета регистра, которое в настоящее время ищет либо usa
, либо what
.
Можно поиграйте с regEx подробнее здесь
да, это идея ... у вас получится { $regex: '(?i)(:s|test)', $options: "i" }
В NodeJS я не могу заставить его работать с вводом от пользователя. Он работает, если я помещаю $ regex: '(? I) (: s | usa | what)', но если я вставляю переменную ключевого слова, такую как var keyword = userInput и $ regex: '(? I) (: s | userInput ) ', mongoDB не распознает. Вы знаете, как решить эту проблему?
$regex: '(?i)(:s|' + userInput + ')'
или, если вы можете использовать шаблонный литерал $regex: (?i)(:s|${userInput})
. Вам нужно в основном объединить части строк и переменную
Понятно! Большое спасибо!
Динамическое регулярное выражение:
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)
Для ключевого слова, скажем, у меня есть значение const keyword = 'test' в nodeJS, могу ли я ввести вот так $ regex: '(? I) (: s | keyword |)', потому что ключевое слово - это ввод от пользователя