java实现mongo查询使用总结

1.简单查询

    public <T>List<T> findQuery(Criteria criteria, Class<T> c ,String tableName) {
        Query query = Query.query(criteria);
        return mongoTemplate.find(query, c, tableName);
    }

2.聚合查询

  public List<Map> aggregateQuery(Criteria criteria, String groupField, String tableName) {
        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group(groupField).count().as("count")
        ).withOptions(aggregationOptions);
        return mongoTemplate.aggregate(aggregation, tableName, Map.class).getMappedResults();
    }

3.复杂聚合查询


  public List<Map> complexAggregateQuery(Criteria criteria, String primaryField, String additionalField, String tableName) {
        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group(primaryField, additionalField),
                Aggregation.group(primaryField).count().as("count")
        ).withOptions(aggregationOptions);
        return mongoTemplate.aggregate(aggregation, tableName, Map.class).getMappedResults();
    }

4.聚合排序limit条数

    public List<Map> aggregateSortQuery(Criteria criteria, String groupField, String tableName, long limit) {
        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group(groupField).count().as("count"),
                Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC,"count"))),
                Aggregation.limit(limit)
        ).withOptions(aggregationOptions);
        return mongoTemplate.aggregate(aggregation, tableName, Map.class).getMappedResults();
    }

4.聚合排序返回对象

   public<T>List<T> aggregateGroupQueryT(Criteria criteria, String groupField, String tableName,Class<T> c) {
        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group(groupField)
        ).withOptions(aggregationOptions);
        return mongoTemplate.aggregate(aggregation, tableName, c).getMappedResults();
    }

5.聚合排序加limit条数返回对象

    public<T>List<T> aggregateSortQueryT(Criteria criteria, String groupField, String tableName, long limit, Class<T> c) {
        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),
                Aggregation.group(groupField).count().as("count"),
                Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC,"count"))),
                Aggregation.limit(limit)
        ).withOptions(aggregationOptions);
        return mongoTemplate.aggregate(aggregation, tableName, c).getMappedResults();
    }
### 关于 JavaMongoDB 的分页查询实现Java使用 MongoDB 进行分页查询是一种常见的需求,通常通过 `skip` 和 `limit` 方法来控制返回的结果集大小以及跳过的文档数量。以下是详细的说明和示例代码。 #### 分页查询的核心概念 分页查询的关键在于两个操作: 1. **Skip**: 跳过指定数量的记录。 2. **Limit**: 限制返回的记录数。 这些方法可以通过 Spring Data MongoDB 或原生 MongoDB 驱动程序轻松实现[^1]。 --- #### 使用 Spring Data MongoDB 实现分页查询 Spring Data 提供了一个强大的工具类 `PageRequest` 来简化分页逻辑。以下是一个完整的例子: ```java 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.query.Query; import java.util.List; public class MongoPaginationExample { @Autowired private MongoTemplate mongoTemplate; public List<Document> getPaginatedDocuments(int page, int size) { Pageable pageable = PageRequest.of(page, size); // 创建分页对象 Query query = new Query().with(pageable); // 将分页应用到查询中 return mongoTemplate.find(query, Document.class); } } ``` 上述代码展示了如何利用 `PageRequest.of(page, size)` 构造分页参数,并将其应用于查询中。 --- #### 使用原生 MongoDB 驱动实现分页查询 如果不依赖 Spring Data,也可以直接使用 MongoDB 原生驱动完成同样的功能。以下是一个基于官方驱动的例子: ```java import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoClients; import org.bson.Document; import static com.mongodb.client.model.Filters.*; public class NativeMongoPagination { public static void main(String[] args) { try (var client = MongoClients.create()) { // 初始化客户端连接 var database = client.getDatabase("test"); var collection = database.getCollection("documents"); int skipCount = 10; // 跳过的文档数 int limitSize = 5; // 返回的最大文档数 FindIterable<Document> documents = collection.find() .skip(skipCount) .limit(limitSize); for (Document doc : documents) { System.out.println(doc.toJson()); } } } } ``` 此代码片段演示了如何手动设置 `skip` 和 `limit` 参数以实现分页效果。 --- #### 日志调试配置 为了更好地理解底层 SQL 查询行为,在应用程序的配置文件中启用日志可以帮助开发者跟踪请求细节。例如,在 `application.properties` 文件中添加如下内容即可开启相关日志输出: ```properties logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG ``` 这一配置能够帮助开发人员捕获并分析实际发送至数据库的操作命令。 --- ### 总结 无论是采用 Spring Data 抽象层还是直接调用 MongoDB 官方 API,都可以高效地构建支持分页的功能模块。推荐优先考虑框架封装好的解决方案(如 `PageRequest`),因为它们不仅减少了重复编码的工作量,还提供了额外的安全性和灵活性保障。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值