我想在使用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的结果,其余结果与所有字符串不匹配。
我希望如果我搜索summer
或Summer
它会向我提供456 and 1212
_Id数据。
答案 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)