使用节点 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 的结果,其余的结果与所有字符串都不匹配。

如果我搜索summerSummer,我希望它会给我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 中的集合内的数组进行排序

节点 js 错误:Mongoose 与 MongoDB 连接字符串

如何在节点js中将变量名作为mongodb的集合名称传递