如何在MongoDB Compass中编写不区分大小写的$in查询?
MongoDB $in 多值不区分大小写查询实现方法
你当前写的语句首先存在语法错误:$in 前多写了一层方括号,基础的正确$in查询格式应为 { category: { $in: ['a012','b23c','5870T'] } }。
针对不区分大小写的筛选需求,有两种可直接在MongoDB Compass中使用的实现方案:
方案1:$in 数组直接传入不区分大小写正则
实际上$in操作符支持传入正则表达式作为匹配条件,你只需要给每个待匹配值加上i(不区分大小写)修饰符即可,写法如下:
{ category: { $in: [ /^a012$/i, /^b23c$/i, /^5870T$/i ] } }
正则前后添加
^和$是为了保持和原字符串等值匹配一致的逻辑,即完整匹配字段值;如果需要模糊匹配包含目标值的内容,直接去掉这两个符号即可。
如果待匹配值包含.、*、?这类正则特殊字符,为了避免转义问题,可以用$regex显式声明匹配规则:
{ category: { $in: [ { $regex: '^a012$', $options: 'i' }, { $regex: '^b23c$', $options: 'i' }, { $regex: '^5870T$', $options: 'i' } ] } }
方案2:基于Collation的不区分大小写查询(大数据量推荐)
正则匹配无法命中普通索引,集合数据量较大时查询性能很差。这种场景建议提前给category字段配置不区分大小写的排序规则(Collation):
- 给
category字段创建索引,索引Collation配置:locale设为对应业务语言(通用场景可设为simple),strength设为2(该级别匹配时会自动忽略大小写、重音符号差异) - 查询时在Compass的Collation配置项中填入和索引完全一致的规则,筛选栏直接写普通$in语句即可:
{ category: { $in: ['a012','b23c','5870T'] } }
该写法可以直接命中索引,查询性能远高于正则方案。
内容的提问来源于stack exchange,提问作者Vipul Prakash
相关产品推荐
相关产品推荐

