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

Spring Data MongoDB 拼接对象双字段实现Criteria模糊查询

Spring Data MongoDB Criteria 多场景查询实现方案

现有代码问题

  1. 未对输入的搜索字符串做拆分校验,无法区分「单关键词模糊匹配任意字段」和「多关键词分别匹配指定字段」的业务场景
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:24:01