我正在使用Mongoose.js执行一个$in查询,如下所示:
userModel.find({
'twitter_username': {
$in: friends
}
})
friends
只是一个字符串数组。但是,我遇到一些大小写问题,想知道是否可以使用Mongo的$regex功能使这个$in查询不区分大小写?
var friends = [/^name1$/i,/^name2$/i];
or,
var friends = [/^(name1|name2)$/i]
userModel.find({"twitter_username":{$in:friends }})
做这样的事情有点复杂。
首先,您应该使用以下方法将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'];
,我获取了两份文档。
new RegExp(\
^${myVar}$`, "i")`将限制为任何精确匹配(忽略大小写)。 - Kevin Beal遗憾的是,mongodb在核心上往往非常区分大小写。你有几个选择:
1)创建一个单独的字段,它是twitter_username的小写版本,并对其进行索引。你的对象将具有twitter_username和twitter_username_lc。非小写的那个可以用于显示等,但小写的那个你要索引并在where子句中使用。
这是我选择为我的应用程序走的路线。
2)从您的用户名字符串中创建一个非常丑陋的正则表达式,在查找之前循环,然后传递它:
db.users.find({handle:{$regex: /^benhowdle89|^will shaver|^superman/i } })