Я хочу использовать добавление регулярного выражения в свой запрос в mongodb.
< Сильный > server.js

app.post('/form',function(req,res){
    var tf = req.body.termFound;
    var str1 ='"keyword":{$regex:/'+tf+'/i}';

db.collection('a').find({str1}).toArray(function (err,results){        
    if (err) return console.log(err)
    res.render('stest.ejs',{arr:results})    
});

Например, если termFound - LOOPS. Я хочу добавить регулярное выражение, чтобы оно стало нечувствительным к регистру, что позволяет мне находить значения полей с помощью (циклы) или (циклы, java)

"keyword":{$regex:/LOOPS/i}

Это делается из кода строки 3 выше. Однако, когда я пытаюсь отправить его на свой mongoDB для подключения. Я подозреваю, что это дает другое значение. Как я пытался

var str1 ='"keyword":{$regex:/'+tf+'/i}';
var str3 ={str1}; 
res.send(str3);

Я вернулся с

{"str1":"\"keyword\":{$regex:/LOOPS/i}"}

Мой последний запрос должен быть примерно таким

   db.collection('a').find({"keyword":$regex:/LOOPS/i}).toArray(function (err,results)

Я экспериментировал с JSON.parse (str1)

var str1 ='"keyword":{$regex:/'+tf+'/i}';
var filters = JSON.parse(str1);
db.collection('a').find(filters).toArray(function (err,results){     

Но дали
SyntaxError: неожиданный токен: в JSON на позиции 9 в JSON.parse ()

Я потратил несколько дней, пытаясь исправить это ... мой вопрос в том, как я могу сделать это с помощью регулярного выражения, чтобы мой поиск не учитывал регистр?

0
Jeremy Wong 24 Сен 2018 в 01:54

2 ответа

Лучший ответ

Изменить: удалось узнать ответ. Пришлось использовать new RegExp () для создания объекта reg exp!

app.post('/form',function(req,res){
    var tf=req.body.toFind;
    db.collection('a').find({"keyword":new RegExp(tf,'i')}).toArray(function (err,results){        
        if (err) return console.log(err)
        res.render('stest.ejs',{question:results})            
    }) 
});  
1
Jeremy Wong 24 Сен 2018 в 00:09

Вы здесь так близко. Вместо того, чтобы пытаться передать строку в ваш MongoDB find, как указано выше, просто передайте регулярное выражение.

Таким образом, вы можете использовать строку шаблона или объединить строки (например, '/'+tf+'/i').

ОБНОВЛЕНИЕ Этот только что упомянутый метод не будет работать по всем причинам, которые я собираюсь объяснить в следующем абзаце относительно исходной проблемы. Это не создает фактического регулярного выражения.

Раньше, когда вы передавали одну строку в функцию поиска, Mongo начинала искать ключ "str1" и проверять, нашел ли он значение этой строки, независимо от "ключевого слова": {$ regex: / '+ tf +' / i} 'будет оцениваться как одна строка (обратите внимание на окружающие одинарные кавычки). Вы не можете вызвать синтаксический анализ JSON для этой конкретной строки, потому что это недопустимая строка в кодировке JSON. См. Пример ниже, который должен работать лучше:

app.post('/form',function(req,res){
    var tf = req.body.termFound;
    // var reg =`/${tf}/i`; not an actual regex, still a string!!!
    var reg = new RegExp(tf, 'i') // as you have since discovered

    db.collection('a').find({"keyword": {$regex: reg }}).toArray(function (err,results){        
        if (err) return console.log(err)
        res.render('stest.ejs',{arr:results})    
    });
})
0
wlh 24 Сен 2018 в 02:51