【问题标题】:Search any word in string mongodb with node js使用节点 js 搜索字符串 mongodb 中的任何单词
【发布时间】:2017-04-04 15:10:50
【问题描述】:

我想在带有 Mongo DB 的 Node JS 项目中创建高级搜索。我在数据库中创建了一个搜索键字段。用户可以在文本框中键入任何单词,我想在字符串中匹配这个单词并获取结果。在我的数据库结构和代码下方。我的代码只匹配字符串的第一个单词,而不是在所有字符串中搜索。

DB : 
{
"_id": ObjectId("001"),
 "searchkey": "Test Product Test Product T-shirt Half sleeves Adidas"
} 
{
"_id": ObjectId("123"), 
 "searchkey": "boy test Product Test Product T-shirt Half sleeves Nike"
} 
{
"_id": ObjectId("456"), 
 "searchkey": "girl test Product Summer Product T-shirt full sleeves Adidas"
} 
{
"_id": ObjectId("789"), 
 "searchkey": "any product any Product any Product T-shirt full sleeves Adidas"
} 
{
"_id": ObjectId("1010"), 
 "searchkey": "woodland Product woodland Product T-shirt Half sleeves woodland"
} 
{
"_id": ObjectId("1212"), 
 "searchkey": "Summer Product Test Product T-shirt Half sleeves Adidas"
} 

My Query : 

Collection.find({searchkey : {$regex: new RegExp('^' + search.toLowerCase(), 'i')},searchkey : {$regex: new RegExp('^' + search.toUpperCase(), 'i')},is_active:true},function(error,fetchSearch){
console.log(fetchSearch);
});

如果我搜索test or TEST,它只会给我一个 id 为 001 的结果,其余的结果与所有字符串都不匹配。

如果我搜索summerSummer,我希望它会给我456 and 1212 _Id 数据。

【问题讨论】:

    标签: javascript node.js mongodb search advanced-search


    【解决方案1】:

    已经回复https://stackoverflow.com/a/50693553/6517383。这是我使用节点中的子词进行搜索的一个简单函数。希望它可以帮助某人

    假设用户搜索pri nks,所以它应该满足打印机和墨水,但 $text 搜索不允许这样做,所以这是我的简单功能:

        var makeTextFilter = (text) => {
        var wordSplited = text.split(/\s+/);
        /** Regex generation for words */
        var regToMatch = new RegExp(wordSplited.join("|"), 'gi');
        let filter = [];
        searchFieldArray.map((item,i) => {
            filter.push({}); 
            filter[i][item] = {
                $regex: regToMatch,
                $options: 'i'
            }
        })
    
        return filter;
      }
    

    并像这样在查询中使用它

    let query = {...query, $or: makeTextFilter(textInputFromUser)}
    tableName.find(query, function (err, cargo_list)
    

    【讨论】:

    • 感谢您的回复,但此问题已解决。这个问题我问了几年。 :)
    • Mahajan sahb 这对其他用户可能会有所帮助
    • 好吧 Mahajan sahb,你也是 mahajan 吗?你来自。
    • 是的,旁遮普省阿姆利则
    【解决方案2】:

    像这样更改您的查询:

    db.getCollection('Stackoverflow').find({ searchkey: {$regex: "test", $options: "$i"}})
    

    【讨论】:

      【解决方案3】:

      您只是检查字符串是否以用户的搜索字符串开头。

      ^ = 表示字符串的开头,所以'^' + search.toLowerCase() 表示搜索以search.toLowerCase() 开头的字符串,仅此而已。如果它不会以搜索字符串开头 - 它不会匹配。这就是为什么 test 只有 id 001 得到匹配。

      将您的搜索模式更改为:'.*' + search.toLowerCase() + '.*' 以在字符串中的任意位置查找搜索字符串。

      Here is the new regex,您可以看到它与 'Summer' 匹配 456 和 1212

      【讨论】:

      • 这意味着现在我的查询如下所示
      • Collection.find({searchkey : {$regex: new RegExp('.*' + search.toLowerCase()+'.*', 'i')},searchkey : {$regex: new RegExp('.*' + search.toUpperCase()+'.*','i')},is_active:true},function(error,fetchSearch){ console.log(fetchSearch); });
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 2011-12-27
      • 2013-10-22
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多