You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Spring-Data检索MongoDB集合?按指定Mongo Shell查询获取List<Document>

嘿,我来帮你搞定Spring Data MongoDB的集合检索问题,还有你要的List<Document>返回示例~

用Spring Data MongoDB检索MongoDB集合的两种核心方式

Spring Data MongoDB提供了两种主要方式来操作MongoDB,根据你的需求(返回原生Document对象),我会重点讲解MongoTemplate的用法,同时也会提一下常规的Repository方式作为补充。

1. 基于MongoRepository的简化检索(适合映射自定义实体)

如果你的业务场景是把MongoDB文档映射到自定义Java实体类,这种方式最省心:

  • 定义一个继承自MongoRepository<T, ID>的接口,Spring会自动实现CRUD方法
  • 可以通过方法名规则(比如findByStatusAndTotalGreaterThan)或@Query注解来编写查询

不过因为你需要返回原生org.bson.Document,这种方式需要额外调整,所以更推荐下面的MongoTemplate方式。

2. 用MongoTemplate直接操作(完美匹配你的List<Document>需求)

MongoTemplate是Spring Data MongoDB的核心操作类,它允许你直接构建和执行MongoDB查询,返回原生的Document对象,完全对应Mongo Shell的查询逻辑。

步骤1:注入MongoTemplate

首先在你的服务类中注入MongoTemplate(Spring Boot会自动配置好,只要你在pom.xml/gradle里引入了spring-boot-starter-data-mongodb依赖):

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import org.bson.Document;
import java.util.List;

@Service
public class MongoCollectionService {

    private final MongoTemplate mongoTemplate;

    // 构造注入(Spring 4.3+推荐的方式,不需要@Autowired)
    public MongoCollectionService(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }
}

步骤2:把Mongo Shell查询转换成Java代码

假设你有这样的Mongo Shell查询示例:

db.products.find({category: "electronics", price: {$lte: 500}}).sort({stockQuantity: -1}).limit(10)

我们把它转换成Spring Data的代码,返回List<Document>:

public List<Document> getAffordableElectronics() {
    // 1. 构建查询条件,对应Mongo Shell里的{category: "electronics", price: {$lte: 500}}
    Criteria criteria = Criteria.where("category").is("electronics")
                                .and("price").lte(500);
    
    // 2. 构建Query对象,添加排序和分页/限制条件
    Query query = Query.query(criteria)
                        .with(Sort.by(Sort.Direction.DESC, "stockQuantity")) // 对应.sort({stockQuantity: -1})
                        .limit(10); // 对应.limit(10)
    
    // 3. 执行查询,指定集合名和返回类型为Document
    return mongoTemplate.find(query, Document.class, "products");
}

复杂场景:聚合查询示例

如果你的Mongo Shell查询是聚合操作,比如:

db.orders.aggregate([
{$match: {status: "shipped"}},
{$group: {_id: "$region", totalSales: {$sum: "$amount"}}},
{$sort: {totalSales: -1}}
])

对应的Spring Data代码如下:

public List<Document> getRegionSalesSummary() {
    // 构建聚合管道
    Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(Criteria.where("status").is("shipped")), // 对应$match阶段
        Aggregation.group("region").sum("amount").as("totalSales"), // 对应$group阶段
        Aggregation.sort(Sort.Direction.DESC, "totalSales") // 对应$sort阶段
    );
    
    // 执行聚合查询,获取结果
    AggregationResults<Document> results = mongoTemplate.aggregate(aggregation, "orders", Document.class);
    return results.getMappedResults();
}

关键注意点

  • 确保你的Spring Boot项目已经正确配置了MongoDB连接(比如在application.yml里配置spring.data.mongodb.uri: mongodb://localhost:27017/your-db-name)
  • Document类来自org.bson.Document包,是MongoDB Java驱动的原生类,完全对应BSON文档结构
  • 如果需要分页,可以用Query.with(PageRequest.of(pageNum, pageSize))来添加分页参数

内容的提问来源于stack exchange,提问作者recoba78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:37:40