MongoDB Regex не возвращает правильный результат - PullRequest
1 голос
/ 28 апреля 2020

У меня есть запрос относительно поиска на mongodb. На моей таблице около 5000 записей данных. Поэтому я должен искать данные от имени нескольких столбцов с небольшим приоритетом. Как и первый приоритет - символ, имя, co_name, bse_symbol, prev_symbol, isin, sc_code. Таким образом, в моем запросе я искал ключ, то есть «DEN», и мой код вернет данные, которые приведены ниже, в которых точный поиск, то есть DEN, идет на 6-й позиции вместо 1-й, потому что это точное совпадение. Мой код возвращает следующие данные:

[
    {
        "co_name": "Aarvee Denims",
        "symbol": "AARVEEDEN",
        "prev_symbol": "",
        "bse_symbol": "",
        "name": "Aarvee Denims & Exports Ltd"
    },
    {
        "co_name": "Confidence Finan",
        "symbol": "CONFINT",
        "prev_symbol": "",
        "bse_symbol": "CONFINT",
        "name": "Confidence Finance & Trading Ltd"
    },
    {
        "co_name": "Confidence Fut.",
        "symbol": "CFEL",
        "prev_symbol": "",
        "bse_symbol": "CFEL",
        "name": "Confidence Futuristic Energetech Ltd"
    },
    {
        "co_name": "Confidence Petro",
        "symbol": "CONFIPET",
        "prev_symbol": "",
        "bse_symbol": "CONFIPET",
        "name": "Confidence Petroleum India Ltd"
    },
    {
        "co_name": "DE Nora India",
        "symbol": "DENORA",
        "prev_symbol": "",
        "bse_symbol": "",
        "name": "DE Nora India Ltd"
    },
    {
        "co_name": "Den Networks",
        "symbol": "DEN",
        "prev_symbol": "",
        "bse_symbol": "",
        "name": "Den Networks Ltd"
    },
    {
        "co_name": "Denis Chem Lab",
        "symbol": "DENISCHEM",
        "prev_symbol": "",
        "bse_symbol": "DENISCHEM",
        "name": "Denis Chem Lab Ltd"
    }..... etc etc
]

Здесь я делюсь своим Node.js кодом.

const rejectSpecialCharacter = req.body.searchterm.replace(
                /[^a-zA-Z0-9 ]/g,
                '',
            );
            // convert user input into upper case to get the result
            const searchQueryUpperCase = rejectSpecialCharacter.toUpperCase();
            if (rejectSpecialCharacter === '') {
                return res.send({Message: 'Oops! no or wrong input provided'});
            }

            // Search Code, Symbol, ISIN, Company Name
            const regex = rejectSpecialCharacter
                .split(' ')
                .map(x => `(?=.*${x})`)
                .join('');
            //console.log(regex)
            const searchQuery = new RegExp(regex, 'i');
            let searchData = await MyTable.find(
                {
                    $and: [
                        {
                            $or: [
                                // { $text: { $search: rejectSpecialCharacter } },
                                { symbol: { $regex: searchQuery } },
                                { name: { $regex: searchQuery } },
                                { co_name: { $regex: searchQuery } },
                                { prev_symbol: { $regex: searchQuery } },
                                { bse_symbol: { $regex: searchQuery } },
                                { archivesymbol: { $regex: searchQuery } },
                                { archiveco_name: { $regex: searchQuery } },
                                { archivename: { $regex: searchQuery } },
                                { isin: { $regex: searchQuery } },
                                { sc_code: { $regex: searchQuery } },
                            ],
                        },
                        { internal_status: 'Active' },
                        // { internal_status: { $ne: 'Delisted' } },
                    ],
                },
                {
                    _id: 0,
                    symbol: 1,
                    name: 1,
                    co_name: 1,
                    bse_symbol: 1,
                    prev_symbol: 1,

                },
            )
                .limit()
                .exec();
            return res.send(searchData)

Есть ли кто-нибудь, кто предлагает мне это, где я делаю ошибки, по которым Мой результат не приходит на первую позицию. PS: мне нужно получить точную запись соответствия сверху, а затем после других подходящих записей

1 Ответ

0 голосов
/ 28 апреля 2020

Я думаю, что вижу проблему тогда. Вы пытаетесь сохранить его в переменной. Это должно быть больше похоже на следующее:

const pathToModel = '/model.js';
router.post('/your-endpoint', (req, res) =>{
     const rejectSpecialCharacter = req.body.searchterm.replace(
                /[^a-zA-Z0-9 ]/g,
                '',
            );
     // convert user input into upper case to get the result
     const searchQueryUpperCase = rejectSpecialCharacter.toUpperCase();
      if (rejectSpecialCharacter === '' || !searchQueryUpperCase) {
          return res.send({Message: 'Oops! no or wrong input provided'});
      }else{
        const regex = rejectSpecialCharacter
              .split(' ')
              .map(x => `(?=.*${x})`)
              .join('');
            //console.log(regex);
        // Search Code, Symbol, ISIN, Company Name
         const searchQuery = new RegExp(regex, 'i');
         // the data passed should use diffrent names due to 'shadow' referencing but, javascript is good enough to figure it out but, it's just poor practice. I applied it hear for readability.
         pathToModel.operation({searchQuery: searchQuery, rejectSpecialCharacter: rejectSpecialCharacter}, function(error, success){
               if(error){
                  return res.status(404).json(error);
               }else if(success && !res.headerSent){
                  return res.status(200).json(success);
              }
         });
      }
});

// you model file
const operation = async (data, callback) =>{
   await MyTable.find(
                {
                    $and: [
                        {
                            $or: [
                                // { $text: { $search: rejectSpecialCharacter } },
                                { symbol: { $regex: searchQuery } },
                                { name: { $regex: searchQuery } },
                                { co_name: { $regex: searchQuery } },
                                { prev_symbol: { $regex: searchQuery } },
                                { bse_symbol: { $regex: searchQuery } },
                                { archivesymbol: { $regex: searchQuery } },
                                { archiveco_name: { $regex: searchQuery } },
                                { archivename: { $regex: searchQuery } },
                                { isin: { $regex: searchQuery } },
                                { sc_code: { $regex: searchQuery } },
                            ],
                        },
                        { internal_status: 'Active' },
                        // { internal_status: { $ne: 'Delisted' } },
                    ],
                },
                {
                    _id: 0,
                    symbol: 1,
                    name: 1,
                    co_name: 1,
                    bse_symbol: 1,
                    prev_symbol: 1,

                },
            )
                .limit()
                .exec(function(error, success){
              if(error) callback(error, null);
              callback(null, success);
    });
}

В зависимости от версии mon goose есть поддержка использования обещаний вместо обратных вызовов, поэтому имейте в виду, что и запрос, и возврат могут быть оптимизированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...