You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data MongoDB中如何实现不区分大小写的IN条件查询

Spring Data MongoDB 不区分大小写IN子句查询实现方案

完全可以实现原生不区分大小写的IN条件匹配,不需要手动转换入参大小写,以下是两种常用场景的实现方式:

方案1:Repository 派生查询实现

直接在Repository接口的查询方法上添加@Collation注解指定排序规则即可,这是最简便的原生实现方案:

public interface CustomerRepository extends MongoRepository<Customer, String> {
    // strength=2代表忽略大小写、重音差异,仅匹配字符基础内容
    @Collation(locale = "en", strength = 2)
    List<Customer> findAllByEmailIn(List<String> emails);
}

如果你的Spring Data MongoDB版本低于2.2不支持@Collation注解,可以用@Query直接指定collation规则:

@Query(value = "{ 'email': { $in: ?0 } }", collation = "{ 'locale' : 'en', 'strength' : 2 }")
List<Customer> findAllByEmailInIgnoreCase(List<String> emails);

方案2:MongoTemplate Criteria 查询实现

同样通过指定collation规则实现原生不区分大小写匹配,性能优于手动转大小写或正则匹配方案,可直接复用原有查询逻辑:

Query query = new Query();
query.addCriteria(Criteria.where("email").in(emails));
// 配置不区分大小写的排序规则
query.collation(Collation.of("en")
        .strength(Collation.ComparisonLevel.secondary()));
return mongoTemplate.find(query, Customer.class);

兼容旧版本的正则实现

如果是不支持collation的老版本MongoDB/ Spring Data MongoDB,可以用正则匹配的方式实现,注意要对入参做正则转义避免注入风险:

// 将每个邮箱转为不区分大小写的正则表达式
List<Pattern> emailPatterns = emails.stream()
        .map(email -> Pattern.compile(Pattern.quote(email), Pattern.CASE_INSENSITIVE))
        .collect(Collectors.toList());
Query query = new Query();
query.addCriteria(Criteria.where("email").in(emailPatterns));
return mongoTemplate.find(query, Customer.class);

注意:collation方案性能最优,如果你给email字段创建了对应collation规则的索引,查询时可以直接命中索引,查询效率和普通IN查询一致。

内容的提问来源于stack exchange,提问作者Borgy Manotoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:15:04