Spring Data MongoDB 拼接对象双字段实现Criteria模糊查询
Spring Data MongoDB Criteria 多场景查询实现方案
现有代码问题
- 未对输入的搜索字符串做拆分校验,无法区分「单关键词模糊匹配任意字段」和「多关键词分别匹配指定字段」的业务场景
- Criteria 语法使用错误:
Criteria.where("customerData.name","customerData.surname")不支持同时传入两个字段作为查询条件
实现逻辑
先对搜索字符串做预处理,按空格拆分后过滤空值,根据有效关键词数量走不同的查询分支:
- 仅1个有效关键词:构造or查询,匹配name或surname字段符合该关键词的结果
- 存在2个及以上有效关键词:构造and查询,取前两个关键词分别匹配name和surname字段
代码示例
import org.springframework.util.StringUtils; import org.springframework.data.mongodb.core.query.Criteria; import java.util.Arrays; import java.util.List; // 预处理搜索字符串 List<String> validKeywords = Arrays.stream(stringData.split(" ")) .filter(StringUtils::hasText) .map(String::trim) .toList(); Criteria searchCriteria = new Criteria(); if (validKeywords.size() == 1) { // 单关键词场景:任意字段匹配即可 String keyword = validKeywords.get(0); searchCriteria.orOperator( // 如果你的字段是嵌套在customerData对象下,改为 "customerData.name" 和 "customerData.surname" Criteria.where("name").regex(keyword), Criteria.where("surname").regex(keyword) ); } else if (validKeywords.size() >= 2) { // 多关键词场景:前两个关键词分别匹配name和surname String nameKeyword = validKeywords.get(0); String surnameKeyword = validKeywords.get(1); searchCriteria.andOperator( Criteria.where("name").regex(nameKeyword), Criteria.where("surname").regex(surnameKeyword) ); } // 将构造好的条件加入你的查询条件列表 criteria.add(searchCriteria);
可选调整
如果需要精确匹配而非模糊匹配,把代码中的regex方法替换为is即可。
内容的提问来源于stack exchange,提问作者Happis
相关产品推荐
相关产品推荐

