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
相关产品推荐
相关产品推荐

