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

我想如果我搜索 summerSummer 它会给我 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)