Spring中MongoDB Aggregation的使用

简介

MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。
db.collection.aggregate()方法是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。

  • 可以多个管道,能方便的进行数据的处理。
  • 聚合效率非常高。
  • 每个阶段管道限制为100MB的内存。可以设置allowDiskUse为true来在聚合管道节点把数据写入临时文件
  • 可以返回一个指针(cursor),数据放在内存中,直接操作
  • 输出的结果只能保存在一个文档中,BSON Document大小限制为16M。可以通过返回指针解决

常用操作

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。

常见操作举例

订单表
    db. orders.insert([    
    {    
            "onumber" : "001",     
            "date" : "2015-07-02",     
            "cname" : "zcy1",     
             "items" :[ {    
                       "ino" : "001",    
                      "quantity" :2,     
                      "price" : 4.0    
                     },{    
                       "ino" : "002",    
                      "quantity" : 4,     
                      "price" : 6.0    
                    }    
                    ]    
    },{    
             "onumber" : "002",     
            "date" : "2015-07-02",     
            "cname" : "zcy2",     
             "items" :[ {    
                      "ino" : "003",    
                      "quantity" :1,     
                      "price" : 4.0    
                       },{    
                      "ino" : "002",    
                      "quantity" :6,     
                      "price" : 6.0    
                     }    
                   ]    
    },{    
             "onumber" : "003",     
            "date" : "2015-07-02",     
            "cname" : "zcy2",     
             "items" :[ {    
                      "ino" : "004",    
                      "quantity" :3,     
                      "price" : 4.0    
                       },{    
                      "ino" : "005",    
                      "quantity" :1,     
                      "price" : 6.0    
                     }    
                   ]    
    },{    
             "onumber" : "004",     
            "date" : "2015-07-02",     
            "cname" : "zcy2",     
             "items" :[ {    
                      "ino" : "001",    
                      "quantity" :3,     
                      "price" : 4.0    
                       },{    
                      "ino" : "003",    
                      "quantity" :1,     
                      "price" : 6.0    
                     }    
                   ]    
    }  
    ])  
  • 查询订单号为001,002,003中的订单详情各个产品卖出多少个,并且过滤掉数量小于1的产品
查询操作示例
@Override  
    public void getAggregation() {  
        Set<String> onumberSet=new HashSet<String>();  
        onumberSet.add("001");  
        onumberSet.add("002");  
        onumberSet.add("003");  
        Aggregation agg = Aggregation.newAggregation(  
                Aggregation.match(Criteria.where("onumber").in(onumberSet)),  
                Aggregation.unwind("items"),  
                Aggregation.group("items.ino").sum("items.quantity").as("total"),  
                Aggregation.match(Criteria.where("total").gt(1))  
        );  
          
        AggregationResults<BasicDBObject> outputType=mongoTemplate.aggregate(agg,"orders", BasicDBObject.class);  
        for (Iterator<BasicDBObject> iterator = outputType.iterator(); iterator.hasNext();) {  
            DBObject obj =iterator.next();  
            System.out.println(obj.toString());  
    } 

参考

posted @ 2022-02-07 16:16  zjcfrancis  阅读(882)  评论(0编辑  收藏  举报