使用节点js搜索字符串mongodb中的任何单词

时间:2016-11-21 09:17:39

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

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

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数据。

3 个答案:

答案 0 :(得分:2)

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

^ =表示字符串的开头,因此'^' + search.toLowerCase()表示搜索以search.toLowerCase()开头的字符串,以及它的字符串。如果它不会以搜索字符串开头 - 它将不匹配。这就是test只有id 001获得匹配的原因。

将搜索模式更改为:'.*' + search.toLowerCase() + '.*',以便在字符串内的任何位置找到搜索字符串。

Here is the new regex,你可以看到它匹配夏天'同时使用456和1212

答案 1 :(得分:1)

更改您的查询:

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

答案 2 :(得分:0)

已经回答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)