Например: В 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', ''),
},
});