Spring Boot MongoDB单查询如何使用or/and、Limit及SQL转Mongo查询
Spring Boot MongoDB Repository组合
or/and/Limit实现方案 前置逻辑说明
注:你给出的SQL中retyrCount为拼写错误,以下示例统一使用常规命名retryCount,可根据实际集合字段名调整。
SQL语法中
AND运算符优先级高于OR,你给出的SQL默认生效逻辑不是(status='pending' OR status='failed') AND retryCount<=3,而是:
- 满足
status = 'pending'的所有记录- 同时满足
status = 'failed'且retryCount <=3的记录
两类记录合并后取前20条。如果你的实际需求是两个status值都要满足重试次数≤3,需要手动给条件加括号调整优先级,下面两种场景都会给出对应实现。
注意:派生方法名查询对复杂嵌套条件的支持有限,涉及多条件优先级调整、括号嵌套的场景,优先选择Criteria构建或@Query注解的方式,避免出现逻辑偏差。
方式一:派生方法名查询(简单场景适用)
直接按照Spring Data MongoDB的方法名规则定义Repository方法,用Top/First关键字实现Limit条数限制,无需额外编写查询语句:
import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface XyzRepository extends MongoRepository<Xyz, String> { // 对应原SQL默认逻辑:status=pending 或者 (status=failed 且 retryCount<=3),取前20条 List<Xyz> findTop20ByStatusOrStatusAndRetryCountLessThanEqual( String pendingStatus, String failedStatus, Integer maxRetryCount ); }
调用时直接传入参数即可:xyzRepository.findTop20ByStatusOrStatusAndRetryCountLessThanEqual("pending", "failed", 3);
方式二:Criteria显式构建查询(复杂逻辑推荐)
注入MongoTemplate用Criteria手动构建查询条件,可以精准控制条件嵌套关系,不会出现优先级错误:
对应原SQL默认优先级逻辑
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import java.util.List; @Service public class XyzService { private final MongoTemplate mongoTemplate; // 构造注入MongoTemplate public XyzService(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public List<Xyz> getMatchedXyzList() { // 构建嵌套条件,明确控制优先级 Criteria condition = new Criteria().orOperator( Criteria.where("status").is("pending"), new Criteria().andOperator( Criteria.where("status").is("failed"), Criteria.where("retryCount").lte(3) ) ); // 拼接条件+限制条数 Query query = Query.query(condition).limit(20); return mongoTemplate.find(query, Xyz.class); } }
对应调整后优先级逻辑(两个status都校验重试次数)
只需要调整Criteria的嵌套结构即可:
Criteria adjustedCondition = new Criteria().andOperator( new Criteria().orOperator( Criteria.where("status").is("pending"), Criteria.where("status").is("failed") ), Criteria.where("retryCount").lte(3) ); Query adjustedQuery = Query.query(adjustedCondition).limit(20);
方式三:@Query注解编写原生查询
直接在Repository方法上用@Query注解写MongoDB原生查询语句,同样配合Top关键字实现条数限制:
public interface XyzRepository extends MongoRepository<Xyz, String> { // 对应原SQL默认逻辑 @Query("{$or: [{status: 'pending'}, {$and: [{status: 'failed'}, {retryCount: {$lte: 3}}]}]}") List<Xyz> findTop20PendingOrFailedRecords(); // 对应调整后优先级逻辑(两个status都校验重试次数) @Query("{$and: [{$or: [{status: 'pending'}, {status: 'failed'}]}, {retryCount: {$lte: 3}}]}") List<Xyz> findTop20PendingOrFailedRecordsWithRetryLimit(); }
原生MongoDB Shell查询写法
如果需要在Mongo客户端直接执行查询,对应原SQL的语句如下:
// 对应原SQL默认逻辑 db.xyz.find({ $or: [ { status: "pending" }, { $and: [ { status: "failed" }, { retryCount: { $lte: 3 } } ] } ] }).limit(20)
// 对应调整后优先级逻辑 db.xyz.find({ $and: [ { $or: [ { status: "pending" }, { status: "failed" } ] }, { retryCount: { $lte: 3 } } ] }).limit(20)
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

