在MongoDB中有效搜索子字符串

时间:2016-07-09 07:30:19

标签: node.js mongodb mongoose

我想在User集合中搜索包含给定用户名的文档,同时用户输入用户名。例如:

数据库:

happyuser
happyuser2
happy_user
userhappy

“hap”中的用户类型,应该找到所有用户名,因为“hap”包含在所有用户名中。当我执行以下操作时,只有在提供完整用户名且找不到查询“hap”的结果时才会找到结果:

User.find(
    {
        $text: {
            $search: "hap",
            $diacriticSensitive: true
        }
    },
    {
        score: {
            $meta: "textScore"
        }
    }, function(err, results) {
    if (err) {
        next(err);
        return;
    }

    return res.json(results);
});

当我通过提供正则表达式搜索时,我只得到结果:

User.find({
    "username": new RegExp("hap")
}).exec(function(err, results) {
    if (err) {
        next(err);
        return;
    }

    return res.json(results);
});

但这不是有效的,对吧?我的意思是,使用正则表达式,MongoDB基本上会触及用户集合中的所有文档,或者我错了吗?这种搜索查询的最佳实践解决方案是什么?

2 个答案:

答案 0 :(得分:0)

使用正则表达式进行搜索非常有效(至少对于sql),除非您的搜索中包含大量字符(复杂随机搜索),这些字符超出了数据库(正则表达式)的功能,或者除非您有太多的数据库要搜索,你的正则表达式需要永远在合理的时间内找到它们。特别是对于mongoDB,我通常会选择:

>db.collection.find( { key: { $regex: 'P.*'} } ).pretty();

这个命令应该给我关于' key'的所有细节。以字母' P'开头。有些人也使用%"你的表达式 - 这里%。但是,我建议上面的命令更有效率。看一下文档:https://docs.mongodb.com/manual/reference/method/db.collection.find/

答案 1 :(得分:0)

在您的示例的上下文中,您将无法执行纯文本搜索。

  

$ text运算符匹配完整的词干。所以,如果一个   文档字段包含单词blueberry,搜索术语blue   不会匹配。但是,蓝莓或蓝莓会匹配。

总之,如果你不想搞乱正则表达式。尝试一下:

User.find().$where(function() {
    return this.username.indexOf('hap') != -1; 
});