Regex 使用正则表达式在mongodb中搜索查询

Regex 使用正则表达式在mongodb中搜索查询,regex,node.js,mongodb,mongoose,Regex,Node.js,Mongodb,Mongoose,我正在建立一个网站,使用nodejs、expressjs、mongodb、mongoose、body解析器等 基本上我已经创建了一个搜索功能,在这里你可以搜索用户,基本上它可以工作,但问题是,它区分大小写,我想用不区分大小写的方法搜索用户 我在stack overflow中找到了一个解决方案,并在我的mongo shell上进行了尝试。这是命令 db.loginusers.find({ $or: [ {"firstname": {$regex: /^P

我正在建立一个网站,使用nodejs、expressjs、mongodb、mongoose、body解析器等

基本上我已经创建了一个搜索功能,在这里你可以搜索用户,基本上它可以工作,但问题是,它区分大小写,我想用不区分大小写的方法搜索用户

我在stack overflow中找到了一个解决方案,并在我的mongo shell上进行了尝试。这是命令

    db.loginusers.find({
    $or: 
    [

        {"firstname": {$regex: /^PIa$/i}}, 
        {"lastname": {$regex: /^NAtUrE$/i}}

    ]
})
这对mongoshell有效。所以当我试着把这个放到我的JS文件中

app.post("/searchresult", function(req, res){
    var thename = req.body.thename;
    LoginUser.find({
        $or: [

            {"firstname": {$regex: /^thename$/i}},
            {"lastname": {$regex: /^thename$/i}}
        ]
    }, function(err, searchedUser){
        if(err){
            console.log(err);
            res.redirect("back");
        } else {
            res.render("searchprofile", {foundUser: searchedUser});
        }
    });
});
它不起作用,尽管我试图在名称上加上正确的大小写,但它不起作用

我的问题是,在我的JS文件上使用正则表达式之前,我需要做些什么吗


谢谢大家!

可以使用
$options:'i'

或:

也可以阅读文档:


它有一些很好的功能,比如:
$nin
$options:'six'
可以用
$options:'i'

或:

也可以阅读文档:


它有一些很好的特性,比如:
$nin
$options:'six'

因为
名称是一个变量,所以使用对象构造函数在变量之外创建一个regex实例,然后可以在查询中使用该实例:

var rgx = new RegExp("^"+ thename +"$", "i");
LoginUser.find({
    "$or": [
        {"firstname": rgx },
        {"lastname": rgx }
    ]
}, callback);

由于名称是一个变量,请使用对象构造函数在变量之外创建一个正则表达式实例,然后在查询中使用该实例,如下所示:

var rgx = new RegExp("^"+ thename +"$", "i");
LoginUser.find({
    "$or": [
        {"firstname": rgx },
        {"lastname": rgx }
    ]
}, callback);

@WiktorStribiżew
thename
是一个变量,我认为这是主要问题。@WiktorStribiżew
thename
是一个变量,我认为这是主要问题。@John我认为您的查询是:^something$,它的意思是:以开头,以结尾。所以它和{firstname:'something'}一样,但在Shaishab的回答中,他只是定义了一个模式,该模式的工作方式是:像中的“%something%”操作符mysql@num8er好的,很酷,谢谢兄弟。但是你能告诉我什么更有效率吗?Shaishab回答还是chridam回答?chridam的答案也很有效。@num8er描述了它。也可以使用类似的:
$regex:/PIa/i
来代替应该有效的
/^PIa$/i
。@John这两个想法是一样的。一个使用regexp对象,另一个使用mongodb的regex语法和option。但我更喜欢Shaishab的答案,因为我不喜欢在代码和消费中创建额外的元素memory@num8er
RegExp
是必需的,因为它允许变量用作regex模式。上面的答案假设静态模式
/PIa/
/NAtUrE/
,因此如果给定一个可变搜索模式,这将不起作用,而这正是OP的问题所在。@John我认为您的查询是:^something$,它的意思是:以开头,以结尾。所以它和{firstname:'something'}一样,但在Shaishab的回答中,他只是定义了一个模式,该模式的工作方式是:像中的“%something%”操作符mysql@num8er好的,很酷,谢谢兄弟。但是你能告诉我什么更有效率吗?Shaishab回答还是chridam回答?chridam的答案也很有效。@num8er描述了它。也可以使用类似的:
$regex:/PIa/i
来代替应该有效的
/^PIa$/i
。@John这两个想法是一样的。一个使用regexp对象,另一个使用mongodb的regex语法和option。但我更喜欢Shaishab的答案,因为我不喜欢在代码和消费中创建额外的元素memory@num8er
RegExp
是必需的,因为它允许变量用作regex模式。上面的答案假设静态模式
/PIa/
/NAtUrE/
,因此在给定可变搜索模式的情况下,这是OP的问题所在。
var rgx = new RegExp("^"+ thename +"$", "i");
LoginUser.find({
    "$or": [
        {"firstname": rgx },
        {"lastname": rgx }
    ]
}, callback);