在Java中使用MongoTemplateAggregation进行多条件查询,并同时实现分页和排序,你需要构建一个包含match(用于过滤)、sort(用于排序)以及skiplimit(用于分页)的聚合管道。不过,需要注意的是,Aggregation框架本身不直接支持分页的skiplimit作为聚合操作的一部分,但你可以通过构建聚合管道时添加这些操作来模拟分页效果。

以下是一个示例,展示了如何使用MongoTemplateAggregation进行多条件查询、排序和分页:

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 {

    @Autowired
    private 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);
        }

        // 转换为MatchOperation
        MatchOperation 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对象作为参数,因此这里的使用是合适的。
  • 分页是通过在聚合管道中添加skiplimit操作来实现的。skip操作跳过指定数量的文档,而limit操作限制返回的文档数量。
  • 排序是通过sort操作实现的,它接受一个排序方向和排序字段。
  • 请确保你已经导入了所有必要的类和包,特别是org.springframework.data.mongodb.core.query.Criteriaorg.springframework.data.domain.Sort.Direction
  • 如果你的查询不需要分组操作,那么就不需要GroupOperation。在这个例子中,我们只使用了matchsortskiplimit
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐