使用节点 js 搜索字符串 mongodb 中的任何单词
Posted
技术标签:
【中文标题】使用节点 js 搜索字符串 mongodb 中的任何单词【英文标题】:Search any word in string mongodb with node js 【发布时间】:2017-04-04 15:10:50 【问题描述】:我想在带有 Mongo DB 的 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 数据。
【问题讨论】:
【参考方案1】:已经回复https://***.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)
【讨论】:
感谢您的回复,但此问题已解决。这个问题我问了几年。 :) Mahajan sahb 这对其他用户可能会有所帮助 好吧 Mahajan sahb,你也是 mahajan 吗?你来自。 是的,旁遮普省阿姆利则【参考方案2】:像这样更改您的查询:
db.getCollection('***').find( searchkey: $regex: "test", $options: "$i")
【讨论】:
【参考方案3】:您只是检查字符串是否以用户的搜索字符串开头。
^
= 表示字符串的开头,所以'^' + search.toLowerCase()
表示搜索以search.toLowerCase()
开头的字符串,仅此而已。如果它不会以搜索字符串开头 - 它不会匹配。这就是为什么 test
只有 id 001 得到匹配。
将您的搜索模式更改为:'.*' + search.toLowerCase() + '.*'
以在字符串中的任意位置查找搜索字符串。
Here is the new regex,您可以看到它与 'Summer' 匹配 456 和 1212
【讨论】:
这意味着现在我的查询如下所示 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); );以上是关于使用节点 js 搜索字符串 mongodb 中的任何单词的主要内容,如果未能解决你的问题,请参考以下文章
mongodb 在全文搜索期间使用节点 js 返回 [] 作为响应
如何在节点 js 和 mongodb 中使用填充的字段键值名称进行搜索?
回调不是使用节点 js 的异步模块的 mongodb 查询中的函数
如何使用节点 js 对 mongoDB 中的集合内的数组进行排序