Как сопоставить две строки с пробелами и без них - PullRequest
0 голосов
/ 30 августа 2018

Например: в БД есть строковое значение типа "cell phones". Если я получу строковое значение типа "cellphones" из внешнего интерфейса. Как я могу сравнить его со строкой БД и получить соответствующие значения строки в ответ.

Ответы [ 10 ]

0 голосов
/ 11 сентября 2018

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

Category.find().exec((err, categories) => {
         var details=[]
         var matchCategory=[]
         categories.map((category,key)=>{
           var obj ={}
           obj.name = category.name.toLowerCase().replace(/\s/g, "")
           details.push(obj);
         })
       if(details.length > 0){
         var detailsLength=details.length
         details.map((category,key)=>{
             if(category.name=="cellphones"){ // match your input string 
               matchCategory.push(category)
             }
             detailsLength--
         })
         if(detailsLength==0){
               resolve(matchCategory);
         }
       }
     })

Это может помочь вам протянуть руку.

0 голосов
/ 04 сентября 2018

Ответы под этим вопросом хороши, как, например, использование where и Regex, но могут быть лучше, если у вас есть небольшое количество документов, которые вы можете запросить.

Если у вас много документов, я бы предложил вам: 1. Используйте дополнительное поле, например cellphone, без пробелов, если ожидается, что значения исходного поля будут короткими. 2. Попробуйте использовать поисковые системы, такие как ElasticSearch или собственный текстовый поиск MongoDB, чтобы найти то, что вам нужно, не только cell phone до cellphone, но mobile phone даже smartphone. На самом деле, когда вы что-то гуглите, при вводе текста подсказки также исходят из похожих, но более сложных алгоритмов.

0 голосов
/ 08 сентября 2018

Может быть, это решит вашу проблему

   Take Device_Names column contains 

               "cell phone"
               "mobile phone"
               "cellphone"
               "laptop"

1.) Обычный способ:

    select Device_Name from devices where Device_Name='cellphone' ;

             result: 
                    "cellphone"

      which is third one

2.) By Удалить пробелы:

  SELECT  Device_Name FROM devices WHERE REPLACE(Device_Name, ' ', '')='cellphone'

               result: 
                    "cell phone"
                    "cellphone"

       which includes first and third one
0 голосов
/ 03 сентября 2018

попробуйте сначала заменить пустую строку из строки запроса, а затем сравнить с полем как

db.test.find(function() { 
    return this.data(function(elm) {
        "cell phones".replace(/ /g,"") == elm.name
    });
});
0 голосов
/ 04 сентября 2018

Учитывая документ, подобный этому:

{
    "text" : "cell phones"
}

Вы можете использовать оператор $where следующим образом:

db.collection.find({
    $where: function() {
        return this.text.replace(' ', '') == "cellphones"
    }
});

Я бы не рекомендовал это для больших коллекций (производительность может быть не очень хорошей). Однако даже при работе с большими коллекциями можно предположить, что можно добиться довольно неплохой производительности, добавив дополнительный фильтр в поле "text", чтобы отфильтровать все документы, которые не начинаются с правильных первых символов:

db.collection.find({
    "text": { $regex: "^" + "cellphones".charAt(0) }, // this will use an index on the "text" field if available
    $where: function() {
        return this.text.replace(' ', '') == "cellphones"
    }
});

Или, возможно, даже эта версия с еще одним фильтром в бите $where, который проверяет длины строк на предмет уменьшенного числа сравнений строк:

db.collection.find({
    "text": { $regex: "^" + "cellphones".charAt(0) }, // this will use an index on the "text" field if available
    $where: function() {
        return this.text.length >= "cellphones".length // performance shortcut
               && this.text.replace(' ', '') == "cellphones"
    }
});
0 голосов
/ 30 августа 2018

Если вам нужен какой-то трюк с агрегацией, вы можете попробовать это

db.collection.aggregate([
  { "$project": {
    "name": {
      "$reduce": {
        "input": { "$split": ["$name", " "] },
        "initialValue": "",
        "in": { "$concat": ["$$value", "$$this"] }
      }
    }
  }},
  { "$match": { "name": "cellphones" }}
])

Вы можете проверить это Здесь

0 голосов
/ 30 августа 2018

Вы можете начать с удаления пробелов в обеих строках перед их сравнением. Я предполагаю, что вы не знаете, какой из них имеет пробелы перед рукой, поэтому вы будете запускать все значения с помощью функции stripSpaces, например:

let a = "cell phone";
let b = "cellphone";
let c = "cell phones"

const stripSpaces = (s) => s.split(' ').join('');

// compare
console.log(stripSpaces(a) == stripSpaces(b)); // true
console.log(stripSpaces(a) == stripSpaces(c)); // false
0 голосов
/ 30 августа 2018

Можно сравнить так:

let val1 = 'cell phones';
let val2 = 'cellphones';

console.log(val1.replace(/\s/g, '') === val2.replace(/\s/g, '')) // true
//OR
console.log(val1.split(' ').join('') === val2.split(' ').join('')) // true
0 голосов
/ 30 августа 2018

Вы можете начать с удаления пробелов в обеих строках перед их сравнением, например:

let a = "cell phone";
let b = "cellphone";
let c = "cell phones"

const stripSpaces = s => s.replace(/\s/g, '');

// compare
console.log(stripSpaces(a) == stripSpaces(b)); // true
console.log(stripSpaces(a) == stripSpaces(c)); // false
0 голосов
/ 30 августа 2018

Вы можете использовать регулярные выражения при поиске значения, например:

cellphones|cell phones

Collection.find({
  someName: {
     $regex: new RegExp('cellphones|cell phones', ''),
  },
});
...