在Java中使用MongoTemplate
和Aggregation
进行多条件查询,并同时实现分页和排序,你需要构建一个包含match
(用于过滤)、sort
(用于排序)以及skip
和limit
(用于分页)的聚合管道。不过,需要注意的是,Aggregation
框架本身不直接支持分页的skip
和limit
作为聚合操作的一部分,但你可以通过构建聚合管道时添加这些操作来模拟分页效果。
以下是一个示例,展示了如何使用MongoTemplate
和Aggregation
进行多条件查询、排序和分页:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.aggregation.MatchOperation;
import org.springframework.data.mongodb.core.aggregation.SortOperation;
import org.springframework.data.mongodb.core.mapping.Field;import java.util.List;public class UserRepository {@Autowiredprivate MongoTemplate mongoTemplate;public List<YourResultType> findUsersByCriteriaWithPaginationAndSorting(String name, Integer age, String status, int page, int size, String sortField, Sort.Direction sortDirection) {// 创建匹配条件Criteria criteria = new Criteria();if (name != null) {criteria = criteria.and("name").is(name);}if (age != null) {criteria = criteria.and("age").is(age);}if (status != null) {criteria = criteria.and("status").is(status);}// 转换为MatchOperationMatchOperation match = Aggregation.match(criteria);// 排序操作SortOperation sort = Aggregation.sort(sortDirection, sortField);// 分页操作(在聚合中模拟)int skipCount = (page - 1) * size;AggregationOperation skip = Aggregation.skip(skipCount);AggregationOperation limit = Aggregation.limit(size);// 创建聚合管道Aggregation aggregation = Aggregation.newAggregation(match, sort, skip, limit);// 执行聚合查询AggregationResults<YourResultType> results = mongoTemplate.aggregate(aggregation, "yourCollectionName", YourResultType.class);// 返回结果return results.getMappedResults();}
}// 注意:
// 1. YourResultType 应该是一个与你的MongoDB文档结构相对应的Java类。
// 2. 你需要将 "yourCollectionName" 替换为你的实际集合名称。
// 3. 导入的 Sort 和 Criteria 类来自 org.springframework.data.mongodb.core.query 包。
// 4. 确保你已经处理了可能的异常,比如 MongoException。
注意:
- 在上面的代码中,我使用了
Criteria
来构建匹配条件,但请注意,Criteria
通常与Query
对象一起使用,而不是直接与Aggregation
一起使用。然而,Aggregation.match()
方法接受一个Criteria
对象作为参数,因此这里的使用是合适的。 - 分页是通过在聚合管道中添加
skip
和limit
操作来实现的。skip
操作跳过指定数量的文档,而limit
操作限制返回的文档数量。 - 排序是通过
sort
操作实现的,它接受一个排序方向和排序字段。 - 请确保你已经导入了所有必要的类和包,特别是
org.springframework.data.mongodb.core.query.Criteria
和org.springframework.data.domain.Sort.Direction
。 - 如果你的查询不需要分组操作,那么就不需要
GroupOperation
。在这个例子中,我们只使用了match
、sort
、skip
和limit
。