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

Javascript 使用节点js搜索字符串mongodb中的任意单词,javascript,node.js,mongodb,search,advanced-search,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":

我想在项目中创建高级搜索,该项目位于带有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或test
,它只会给我一个id为001的结果,其余结果与所有字符串都不匹配


我想知道如果我搜索
summer
summer
,它会给我
456和1212
\u Id数据。

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

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

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


,您可以看到它将“Summer”与456和1212匹配。您只需检查字符串是否以用户的搜索字符串开头

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

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


,您可以看到它将“Summer”与456和1212匹配,请按如下方式更改您的查询:

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

按如下方式更改查询:

db.getCollection('Stackoverflow').find({ searchkey: {$regex: "test", $options: "$i"}})
已经回答了。下面是一个简单的函数,我使用node中的子词进行搜索。希望它能帮助别人

让我们假设用户搜索
pri-nks
,因此它应该满足打印机和墨水的要求,但$text search不允许这样做,因此下面是我的简单功能:

    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)
已经回答了。下面是一个简单的函数,我使用node中的子词进行搜索。希望它能帮助别人

让我们假设用户搜索
pri-nks
,因此它应该满足打印机和墨水的要求,但$text search不允许这样做,因此下面是我的简单功能:

    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)

这意味着现在我的查询类似于belowCollection.find({searchkey:{$regex:new RegExp('.'.'+search.toLowerCase()+'.'.'','i'))},searchkey:{$regex:new RegExp('.'.'.'.'.+search.toUpperCase()+'.'.'''i')},处于活动状态:true},函数(错误,fetchSearch){console.log(fetchSearch);});这意味着现在我的查询类似于belowCollection.find({searchkey:{$regex:new RegExp('.'.'+search.toLowerCase()+'.'.'','i'))},searchkey:{$regex:new RegExp('.'.'.'.'.+search.toUpperCase()+'.'.'''i')},处于活动状态:true},函数(错误,fetchSearch){console.log(fetchSearch);});谢谢你的回复,但这个问题已经解决了。这是我几年来一直在问的问题Mahajan sahb这对其他用户可能会有帮助OK Mahajan sahb,你也是Mahajan?你来自旁遮普省,是的,谢谢你的回复,但这个问题已经解决了。这是我几年来一直在问的问题Mahajan sahb这对其他用户可能会有帮助OK Mahajan sahb,你也是Mahajan?你来自旁遮普阿姆利则