使用节点 js 搜索字符串 mongodb 中的任何单词
Search any word in string mongodb with node js
我想在带有 Mongo 数据库的 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 的结果,其余结果与所有字符串都不匹配。
我想如果我搜索 summer
或 Summer
它会给我 456 and 1212
_Id 数据。
您只是在检查字符串是否以用户的搜索字符串开头。
^
= 表示字符串的开始,所以 '^' + search.toLowerCase()
表示搜索以 search.toLowerCase()
开头的字符串,就是这样。如果它不以搜索字符串开头 - 它不会匹配。这就是 test
只有 id 001 匹配的原因。
将您的搜索模式更改为:'.*' + search.toLowerCase() + '.*'
以在字符串中的任意位置查找搜索字符串。
Here is the new regex,你可以看到它匹配 'Summer' 与 456 和 1212
像这样更改您的查询:
db.getCollection('Whosebug').find({ searchkey: {$regex: "test", $options: "$i"}})
已回答。这是我在节点中使用子词搜索的一个简单函数。希望对某人有所帮助
假设用户搜索 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)
我想在带有 Mongo 数据库的 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 的结果,其余结果与所有字符串都不匹配。
我想如果我搜索 summer
或 Summer
它会给我 456 and 1212
_Id 数据。
您只是在检查字符串是否以用户的搜索字符串开头。
^
= 表示字符串的开始,所以 '^' + search.toLowerCase()
表示搜索以 search.toLowerCase()
开头的字符串,就是这样。如果它不以搜索字符串开头 - 它不会匹配。这就是 test
只有 id 001 匹配的原因。
将您的搜索模式更改为:'.*' + search.toLowerCase() + '.*'
以在字符串中的任意位置查找搜索字符串。
Here is the new regex,你可以看到它匹配 'Summer' 与 456 和 1212
像这样更改您的查询:
db.getCollection('Whosebug').find({ searchkey: {$regex: "test", $options: "$i"}})
已回答。这是我在节点中使用子词搜索的一个简单函数。希望对某人有所帮助
假设用户搜索 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)