查询中的Mongo $,不区分大小写

时间:2014-12-08 17:01:46

标签: mongodb mongoose

我使用Mongoose.js执行$ in查询,如下所示:

userModel.find({
            'twitter_username': {
                $in: friends
            }
        })

friends只是一个字符串数组。但是,我有一些案例问题,并想知道我是否可以使用Mongo的$ regex功能来使这个$ in查询不区分大小写?

3 个答案:

答案 0 :(得分:4)

来自docs

  

要在$ in查询表达式中包含正则表达式,您可以   仅使用JavaScript正则表达式对象(即/ pattern /)。对于   例如:

     

{name:{$ in:[/ ^ acme / i,/ ^ ack /]}}

一种方法是为每个匹配创建正则表达式并形成好友数组。

 var friends = [/^name1$/i,/^name2$/i];
 or,
 var friends = [/^(name1|name2)$/i]
 userModel.find({"twitter_username":{$in:friends }})

答案 1 :(得分:4)

做这样的事情有点棘手

首先,您应该将friends转换为新的正则表达式数组列表:

var insesitiveFriends = [];

friends.forEach(function(item)
{
    var re = new RegExp(item, "i");
    insesitiveFriends.push(re);    
})

然后运行查询

db.test.find(
{
   'twitter_username':
    {
        $in: insesitiveFriends
    }
})

我在测试集合中有示例文档

/* 0 */
{
    "_id" : ObjectId("5485e2111bb8a63952bc933d"),
    "twitter_username" : "David"
}

/* 1 */
{
    "_id" : ObjectId("5485e2111bb8a63952bc933e"),
    "twitter_username" : "david"
}

和var friends = ['DAvid','bob'];我收到了两份文件

答案 2 :(得分:0)

可悲的是,mongodb往往在核心问题上非常敏感。你有几个选择:

1)创建一个单独的字段,该字段是twitter_username的小写版本,并将其编入索引。您的对象将具有twitter_username和twitter_username_lc。可以用于显示的非低可见性等,但是你在where子句中索引和使用的小写等等。

这是我选择申请的路线。

2)在查找之前在循环中从您的用户名字符串创建一个非常丑陋的正则表达式,然后将其传入:

db.users.find({handle:{$regex: /^benhowdle89|^will shaver|^superman/i } })

请注意,使用'以'开头如果字段被编入索引,则胡萝卜的效果会更好。