Поиск любого слова в строке mongodb с помощью узла js

Я хочу создать расширенный поиск в проекте, который находится в Node JS с Mongo DB. Я создал поле в БД, которое является ключом поиска. пользователь может ввести любое слово в текстовое поле, и я хочу сопоставить это слово в строке и получить результат. ниже моей структуры БД и кода. мой код работает только с первым словом строки, а не с поиском во всей строке.

DB : 
{
"_id": ObjectId("001"),
 "searchkey": "Test Product Test Product T-shirt Half sleeves Adidas"
} 
{
"_id": ObjectId("123"), 
 "searchkey": "boy test Product Test Product T-shirt Half sleeves Nike"
} 
{
"_id": ObjectId("456"), 
 "searchkey": "girl test Product Summer Product T-shirt full sleeves Adidas"
} 
{
"_id": ObjectId("789"), 
 "searchkey": "any product any Product any Product T-shirt full sleeves Adidas"
} 
{
"_id": ObjectId("1010"), 
 "searchkey": "woodland Product woodland Product T-shirt Half sleeves woodland"
} 
{
"_id": ObjectId("1212"), 
 "searchkey": "Summer Product Test Product T-shirt Half sleeves Adidas"
} 

My Query : 

Collection.find({searchkey : {$regex: new RegExp('^' + search.toLowerCase(), 'i')},searchkey : {$regex: new RegExp('^' + search.toUpperCase(), 'i')},is_active:true},function(error,fetchSearch){
console.log(fetchSearch);
});

Если я ищу test or TEST, это даст мне только один результат с идентификатором 001, а остальные результаты не совпадают со всей строкой.

Я хочу, например, если я буду искать summer или Summer, это даст мне 456 and 1212 _Id данные.


person Pritesh Mahajan    schedule 21.11.2016    source источник


Ответы (3)


Вы только проверяете, начинается ли строка со строки поиска пользователя.

^ = означает начало строки, поэтому '^' + search.toLowerCase() означает поиск строки, начинающейся с search.toLowerCase(), и все. Если он не будет начинаться со строки поиска, он не будет совпадать. Вот почему для test подходит только id 001.

Измените шаблон поиска на: '.*' + search.toLowerCase() + '.*', чтобы найти строку поиска в любом месте внутри строк.

Вот новое регулярное выражение, вы можете видеть, что оно соответствует 'Summer' как 456, так и 1212.

person Alon Adler    schedule 21.11.2016
comment
это означает, что теперь мой запрос, как показано ниже - person Pritesh Mahajan; 21.11.2016
comment
Collection.find({searchkey : {$regex: новое регулярное выражение('.*' + search.toLowerCase()+'.*', 'i')},searchkey : {$regex: новое регулярное выражение('.*' + search.toUpperCase()+'.*','i')},is_active:true},function(error,fetchSearch){ console.log(fetchSearch); }); - person Pritesh Mahajan; 21.11.2016

Измените свой запрос следующим образом:

db.getCollection('Stackoverflow').find({ searchkey: {$regex: "test", $options: "$i"}})
person Mital Gajjar    schedule 21.11.2016

Уже ответил https://stackoverflow.com/a/50693553/6517383. Вот простая функция, которую я сделал для поиска по подсловам в node. Надеюсь, это поможет кому-то

Предположим, что пользователь ищет pri nks, поэтому он должен удовлетворить принтер и чернила, но поиск $text не позволяет этого, поэтому вот моя простая функция:

    var makeTextFilter = (text) => {
    var wordSplited = text.split(/\s+/);
    /** Regex generation for words */
    var regToMatch = new RegExp(wordSplited.join("|"), 'gi');
    let filter = [];
    searchFieldArray.map((item,i) => {
        filter.push({}); 
        filter[i][item] = {
            $regex: regToMatch,
            $options: 'i'
        }
    })

    return filter;
  }

и используйте его в своем запросе следующим образом

let query = {...query, $or: makeTextFilter(textInputFromUser)}
tableName.find(query, function (err, cargo_list)
person Black Mamba    schedule 05.06.2018
comment
спасибо за ответ, но эта проблема решена. этот вопрос я задавал пару лет. :) - person Pritesh Mahajan; 05.06.2018
comment
Mahajan sahb это для других пользователей, они могут найти это полезным - person Black Mamba; 05.06.2018
comment
Хорошо Махаджан Сахб, ты тоже Махаджан? Ты из. - person Pritesh Mahajan; 05.06.2018
comment
Да, Амритсар Пенджаб - person Black Mamba; 05.06.2018