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

Spring Boot中对MongoDB数值字段(Integer/Double)执行LIKE查询

在Spring Boot中对MongoDB数值字段实现前缀匹配(LIKE)查询

问题分析

你遇到的核心问题是:MongoDB的$regex操作符仅对字符串类型字段生效,而你的salary是数值类型(Integer/Double),没法直接用普通的正则查询。要实现“数值以指定数字开头”的效果,需要借助$where操作符执行JavaScript表达式,将数值转换为字符串后再做正则匹配。

解决方案

在Spring Data MongoDB中,你可以通过Criteria.where("$where")来添加$where条件,编写对应的JavaScript正则验证逻辑。下面是修改后的完整代码:

String game = "football";
String salaryPrefix = "250"; // 要匹配的数值前缀
Query query = new Query();
Set<String> gameType = new HashSet<>();
List<Criteria> andCriteria = new ArrayList<>();

gameType.add(game);
andCriteria.add(Criteria.where("type").in(gameType));
// 添加$where条件:将salary转为字符串后匹配前缀正则
andCriteria.add(Criteria.where("$where").is(String.format("/^%s.*/.test(this.salary.toString())", salaryPrefix)));

Criteria[] criteriaArray = andCriteria.toArray(new Criteria[andCriteria.size()]);
query.addCriteria(new Criteria().andOperator(criteriaArray));

List<Players> players = mongoTemplate.find(query, Players.class);
return players;

代码说明

  • $where表达式:"/^250.*/.test(this.salary.toString())"的作用是:
    • 将this.salary(当前文档的salary字段)转换为字符串
    • 用正则^250.*验证字符串是否以"250"开头
  • 动态前缀:用String.format可以灵活替换要匹配的前缀,比如换成"400"就能匹配薪资以400开头的文档。

生成的查询语句

这段代码会生成你期望的MongoDB查询:

db.players.find({ 
  $and: [
    { "type": { $in: ["football"] } }, 
    { $where : "/^250.*/.test(this.salary.toString())" }
  ] 
})

预期返回结果

执行后会返回符合条件的2条文档:

{"firstName" : "Neymar", "lastName" : "Jr", "team" : "Paris Saint-Germain F.C.", "salary" : 25000, "type" : "football"},
{"firstName" : "Luis", "lastName" : "Alberto", "team" : "FC Barcelona", "salary" : 25000, "type" : "football"}

注意事项

  • 性能问题:$where操作符会在服务器端执行JavaScript,无法利用MongoDB的索引,当集合数据量较大时,查询性能会受影响。
  • 优化建议:如果这类查询是高频操作,建议在文档中额外存储一个salaryStr字符串类型字段,同步保存薪资的字符串形式,之后直接用regex查询该字段,这样可以利用索引提升性能。

内容的提问来源于stack exchange,提问作者Rahul Ghadage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:38:20