我正在使用猫鼬.js来执行$in查询,如下所示:
userModel.find({
'twitter_username': {
$in: friends
}
})
friends
只是一个字符串数组。但是,我遇到了一些大小写问题,并且想知道我是否可以使用 Mongo 的 $regex 功能使此$in查询不区分大小写?
从文档中:
若要在$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 }})
做这样的事情有点棘手
首先,您应该使用以下方法将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'];
我得到了两个文件
可悲的是,mongodb 的核心往往区分大小写。您有以下几种选择:
1) 创建一个单独的字段,该字段是twitter_username的小写版本,并改为为该字段编制索引。您的对象将具有twitter_username和twitter_username_lc。您可以用于显示等的非小写字母,但您可以在 where 子句等中索引和使用的小写字母。
这是我选择申请的路线。
2)在查找之前,从您的用户名字符串中循环创建一个非常丑陋的正则表达式,然后将其传入:
db.users.find({handle:{$regex: /^benhowdle89|^will shaver|^superman/i } })
请注意,如果字段已编制索引,则使用"开头为"^ 胡萝卜的性能更好。