如何使用Spring-Data检索MongoDB集合?按指定Mongo Shell查询获取List<Document>
嘿,我来帮你搞定Spring Data MongoDB的集合检索问题,还有你要的List<Document>返回示例~
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

