Mongo $in查询大小写不敏感

4

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

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

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

3个回答

7
文档中得知:
为在$in查询表达式中包含正则表达式,您只能使用JavaScript正则表达式对象(即/pattern/)。例如:
{ name: { $in: [ /^acme/i, /^ack/ ] } }
一种方法是为每个匹配项创建正则表达式并形成friends数组。
 var friends = [/^name1$/i,/^name2$/i];
 or,
 var friends = [/^(name1|name2)$/i]
 userModel.find({"twitter_username":{$in:friends }})

尝试了这个,但我用一个正则表达式数组让它工作了,即[/foo|bar/i]。 - benhowdle89
很好。那将更加优化。我一定会在我的答案中包含它。 - BatScream

5

做这样的事情有点复杂。

首先,您应该使用以下方法将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"
}

使用变量 friends = ['David','bob'];,我获取了两份文档。


1
对于那些使用变量而不是硬编码字符串的人来说,这是正确的答案。 - Ace Eusebio
1
好的回答 @Disposer - Aboobakkar P S
1
这并不完全正确。这将匹配更多的内容,超出了您的意图。它将查找包含“David”的子字符串,包括“David_more_at_the_end”。new RegExp(\^${myVar}$`, "i")`将限制为任何精确匹配(忽略大小写)。 - Kevin Beal

0

遗憾的是,mongodb在核心上往往非常区分大小写。你有几个选择:

1)创建一个单独的字段,它是twitter_username的小写版本,并对其进行索引。你的对象将具有twitter_username和twitter_username_lc。非小写的那个可以用于显示等,但小写的那个你要索引并在where子句中使用。

这是我选择为我的应用程序走的路线。

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

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

请注意,如果该字段已经建立索引,则使用“以...开头”的 ^ 符号会更有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接