Spring Data MongoDB七:进阶Aggregation操作(下)

本文转载至:http://blog.csdn.net/congcong68/article/details/52821362

 一、Spring Data MongoDB   Aggregation 简介                                                              

     上一篇已经Aggregation 做了很详细的介绍,这边就不在介绍,spring Data  MongoDB 项目提供与MongoDB文档数据库的集成,Spring Data MongoDB提供org.springframework.data.mongodb.core.MongoTemplate是对Connection进行封装,提供了连接管理,Spring Data MongoDB hibernate等一样提供了模板,mongoTemplate提供调用Aggregation 方法。


二、Spring Data MongoDB Aggregation 方法                                                                                                                                                         

          mongoTemplate提供调用4个Aggregation 方法

           

    

 【AggregationOperation】

                     

                MongoDB Aggregation 提供了Aggregation Operations ,Spring Data MongoDB 也提供这些方法,方便的操作


               Pipeline Aggregation Operators                  project, skip, limit, unwind, group, sort, geoNear

               Group Aggregation Operators                    addToSet, first, last, max, min, avg, push, sum, (*count)

               Arithmetic Aggregation Operators               add (*via plus), subtract (*via minus), multiply, divide, mod

               Comparison Aggregation Operators          eq (*via: is), gt, gte, lt, lte, ne

              

               Group Aggregation查看源代码:


               GroupOperation  implements FieldsExposingAggregationOperation    ,  FieldsExposingAggregationOperation extends AggregationOperation

              GroupOperation  提供了 addToSet, first, last, max, min, avg, push, sum等方法

                 



   【TypedAggregation】

                 TypedAggregation<I> extends Aggregation   提供了Class<I> inputType  一个输入类型,也就是对哪个集合进行操作,我们可以查看源代码

            

 【outputType】

                     输出类型,可以指定具体的实体类型,官方的例子:

                      更多的例子可以查看官方网文档 Spring Data MongoDB 文档

           

 

                 

                outputType我们项目中运用比较多的是BasicDBObject.class,操作也比较方便,不用特意定义一个实体类,可以把Aggregation封装一个通用的方法。

三、Spring Data MongoDB Aggregation 例子                                                                                                                                                         

               我们需要查询订单号为001,002,003中的订单详情各个产品卖出多少个,并且过滤掉数量小于1的产品

 Aggregation 实现类】

                        

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2.     public void getAggregation() {  
  3.         Set<String> onumberSet=new HashSet<String>();  
  4.         onumberSet.add("001");  
  5.         onumberSet.add("002");  
  6.         onumberSet.add("003");  
  7.         Aggregation agg = Aggregation.newAggregation(  
  8.                 Aggregation.match(Criteria.where("onumber").in(onumberSet)),  
  9.                 Aggregation.unwind("items"),  
  10.                 Aggregation.group("items.ino").sum("items.quantity").as("total"),  
  11.                 Aggregation.match(Criteria.where("total").gt(1))  
  12.         );  
  13.           
  14.         AggregationResults<BasicDBObject> outputType=mongoTemplate.aggregate(agg,"orders", BasicDBObject.class);  
  15.         for (Iterator<BasicDBObject> iterator = outputType.iterator(); iterator.hasNext();) {  
  16.             DBObject obj =iterator.next();  
  17.             System.out.println(obj.toString());  
  18.     }  
  19.           
  

【测试类】

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class TestOrders {  
  2.      private static OrdersDao ordersDaoImpl;    
  3.         private static  ClassPathXmlApplicationContext  app;    
  4.         @BeforeClass      
  5.         public static void initSpring() {     
  6.             try {           
  7.              app = new ClassPathXmlApplicationContext("classpath:applicationContext-mongo.xml");      
  8.              ordersDaoImpl = (OrdersDao) app.getBean("ordersDaoImpl");     
  9.             } catch (Exception e) {    
  10.                 e.printStackTrace();    
  11.             }    
  12.                }     
  13.             
  14.             @Test     
  15.             public void testAggregation()    
  16.             {    
  17.                 ordersDaoImpl.getAggregation();  
  18.                   
  19.             }    
  20. }  


【测试结果】

           


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Data MongoDB 中,可以使用 Aggregation Framework 来进行多表分组。下面是一个示例: 假设我们有两个集合,一个是 orders,另一个是 customers,orders 集合中有一个字段 customer_id,表示订单所属的客户。现在我们想要按照客户性别统计他们的订单数量。可以使用以下代码实现: ```java import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.Fields; import org.springframework.data.mongodb.core.aggregation.LookupOperation; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.stereotype.Repository; import java.util.List; @Repository public class OrderRepositoryImpl implements OrderRepositoryCustom { private final MongoTemplate mongoTemplate; public OrderRepositoryImpl(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } @Override public List<OrderCountByGender> countOrdersByGender() { LookupOperation lookupOperation = LookupOperation.newLookup() .from("customers") .localField("customer_id") .foreignField("_id") .as("customer"); Aggregation aggregation = Aggregation.newAggregation( lookupOperation, Aggregation.project("customer.gender"), Aggregation.group("customer.gender").count().as("count"), Aggregation.project(Fields.fields("count")).and("gender").previousOperation() ); return mongoTemplate.aggregate(aggregation, "orders", OrderCountByGender.class).getMappedResults(); } } ``` 其中 OrderCountByGender 是一个 POJO 类,用于存储按照性别统计的订单数量: ```java public class OrderCountByGender { private String gender; private Long count; // getters and setters } ``` 在上面的代码中,我们使用 LookupOperation 将 orders 集合中的 customer_id 与 customers 集合中的 _id 关联起来。然后,使用 Aggregation 进行分组统计,最后使用 mongoTemplate.aggregate 方法执行聚合操作,并将结果映射到 OrderCountByGender 类型的对象列表中返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值