Как совместить две строки с и без пробелов

Например: В DB у меня есть строковое значение, например "cell phones". Если я получаю строковое значение, например, "cellphones" из интерфейса. Как я могу сравнить его с строкой DB и получить ответные строковые значения.

Ответ 1

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

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);
         }
       }
     })

Это может помочь вам разобраться.

Ответ 2

Вы можете сравнить так:

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Сначала вы можете начать с отсечения пробелов на обеих строках, прежде чем сравнивать их. Я предполагаю, что вы не знаете, у кого есть пробелы перед рукой, поэтому вы будете запускать все значения через функцию 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

Ответ 7

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

db.test.find(function() { 
    return this.data(function(elm) {
        "cell phones".replace(/ /g,"") == elm.name
    });
});

Ответ 8

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

{
    "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"
    }
});

Ответ 9

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

   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.) Удалить места:

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

               result: 
                    "cell phone"
                    "cellphone"

       which includes first and third one

Ответ 10

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

cellphones|cell phones

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