2016-11-21 90 views
0

我想在使用MongoDB的Node JS中的项目中创建高级搜索。我在数据库中创建了一个搜索关键字段。用户可以在文本框中输入任何单词,并且我希望在字符串中匹配并获取结果。低于我的数据库结构和代码。我的代码工作只匹配所有字符串中不搜索的字符串的第一个字。在节点js中搜索字符串mongodb中的任何词

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

回答

2

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

^ =表示字符串的开始,所以'^' + search.toLowerCase()意味着搜索被开始search.toLowerCase()一个字符串,仅此而已。如果它不会以搜索字符串开始 - 它不会匹配。这就是为什么test只有id 001获得一场比赛。

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

Here is the new regex,你可以看到它是匹配的 '夏季' 既456和1212

+0

现在意味着我的查询像下面 –

+1

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

+0

谢谢先生(弓) –

1

更改您的查询是这样的:

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