如何在不包含空格的情况下匹配两个字符串

时间:2018-08-30 07:40:42

标签: node.js mongodb mongodb-query aggregation-framework

例如:在数据库中,我具有类似"cell phones"的字符串值。如果我从前端获得了像"cellphones"这样的字符串值。如何将其与数据库字符串进行比较并获得相关的字符串值作为响应。

10 个答案:

答案 0 :(得分:10)

您可以这样比较:

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

答案 1 :(得分:6)

如果您需要一些汇总技巧,则可以尝试

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

您可以对其进行测试 Here

答案 2 :(得分:5)

首先可以先在两个字符串上去除空格,然后再进行比较,例如:

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

答案 3 :(得分:4)

这个问题下面的答案很好,就像使用whereRegex一样,但是如果您要查询的文档数量很少,可能是最好的选择。

如果您有很多文档,我建议您:   1.如果预期原始字段的值较短,则使用cellphone之类的多余字段,不要留任何空格。   2.尝试使用诸如ElasticSearch或MongoDB自己的文本搜索之类的搜索引擎来查找所需的内容,不仅需要cell phonecellphone,还可以找到mobile phone甚至smartphone。实际上,当您搜索某些内容时,您在键入内容时的建议也来自相似但更复杂的算法。

答案 4 :(得分:4)

只需在查询查找后从响应中删除那些空格,然后将响应传递给require输入字段即可。然后将该字符串与前端或输入字符串匹配。如果两者都匹配,请加载所需的内容。 假设集合名称为“类别”。然后样本查询将像这样

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

这可以帮助您伸出援手。

答案 5 :(得分:2)

您可以先比较两个字符串的空格,然后再进行比较。我假设您不知道哪个空格之前有空格,所以您将通过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

答案 6 :(得分:2)

首先尝试从查询字符串中替换空字符串,然后将其与字段进行比较

$(document).load($(window).bind("resize", function () {
    if (window.matchMedia('(min-width: 767px)').matches && window.matchMedia('(max-width: 1259px)').matches) {
        $('.filter--facet-container').each(function () {
            if ($(this).children().length >= 3 && $(this).children().length <= 4) {
                $(".listing--actions.filter--container-additional").css("height", "125px");
            }
        })
    }
}));

答案 7 :(得分:2)

给出这样的文档:

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

答案 8 :(得分:2)

也许可以解决您的问题

   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

答案 9 :(得分:1)

寻找值时可以使用正则表达式,例如:

cellphones|cell phones

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