MongoDB 彙總Group(一)

來源:互聯網
上載者:User

標籤:order   src   group   select   term   get   添加   _id   not   

原文:http://blog.csdn.net/congcong68/article/details/45012717

 

 

  一.簡介 

    db.collection.group()使用JavaScript,它受到了一些效能上的限制。大多數情況下,$ group在Aggregation Pipeline提供了一種具有較少的限制適用的替代。可以通過指定的鍵的集合中的文檔和執行簡單的彙總函式。在2.2版本中,返回的數組可以包含最多20000個元素;即最多20000個獨特的分組。

    我們比較熟悉的group by 的sql語句select key from table  groupby key,而mongoDB沒提供SQL那樣通過Group By就輕鬆實現資料庫的分組功能,我們通過介面來實現的

   db.collection.group({ key, reduce, initial[, keyf] [, cond] [, finalize] })

   

key

作為分組的key

reduce

一個彙總函式操作文檔的分組操作期間。這些函數可以返回一個sum或count。該函數接受兩個參數:當前文檔和這個群體聚集的結果文檔。

initial

初始化彙總結果文檔變數,為空白時自動為每列提供初始變數。

keyf

可選。替代的key 欄位。指定一個函數建立一個“key object”作為分組的key。使用keyf而是通過group by領域而不是現有的文檔域鍵組。

cond

過濾條件

finalize

在db.collection.group()返回最終結果之前,此功能可以修改的結果文檔或替換的結果文檔作為一個整體。

  

 

  

二.Mongo VUE操作Group By  1.MonogoDB資料庫中添加了訂單的資料

 

 

[html] view plain copy 
  1. /* 0 */  
  2. {  
  3.  "_id" : ObjectId("552a330e05c27486b9b9b650"),  
  4.  "_class" : "com.mongo.model.Orders",  
  5.  "onumber" : "002",  
  6.  "date" : ISODate("2014-01-03T16:03:00Z"),  
  7.  "cname" : "zcy",  
  8.  "item" : {  
  9.    "quantity" : 1,  
  10.    "price" : 4.0,  
  11.    "pnumber" : "p002"  
  12.   }  
  13. }  
  14.    
  15. /* 1 */  
  16. {  
  17.  "_id" : ObjectId("552a331d05c275d8590a550d"),  
  18.  "_class" : "com.mongo.model.Orders",  
  19.  "onumber" : "003",  
  20.  "date" : ISODate("2014-01-04T16:03:00Z"),  
  21.  "cname" : "zcy",  
  22.  "item" : {  
  23.    "quantity" : 10,  
  24.    "price" : 2.0,  
  25.    "pnumber" : "p001"  
  26.   }  
  27. }  
  28.    
  29. /* 2 */  
  30. {  
  31.  "_id" : ObjectId("552a333105c2f28194045a72"),  
  32.  "_class" : "com.mongo.model.Orders",  
  33.  "onumber" : "003",  
  34.  "date" : ISODate("2014-01-04T16:03:00Z"),  
  35.  "cname" : "zcy",  
  36.  "item" : {  
  37.    "quantity" : 30,  
  38.    "price" : 4.0,  
  39.    "pnumber" : "p002"  
  40.   }  
  41. }  
  42.    
  43. /* 3 */  
  44. {  
  45.  "_id" : ObjectId("552a333f05c2b62c01cff50e"),  
  46.  "_class" : "com.mongo.model.Orders",  
  47.  "onumber" : "004",  
  48.  "date" : ISODate("2014-01-05T16:03:00Z"),  
  49.  "cname" : "zcy",  
  50.  "item" : {  
  51.    "quantity" : 5,  
  52.    "price" : 4.0,  
  53.    "pnumber" : "p002"  
  54.   }  
  55. }  

 

 

2.MongoDB實現分組並統計

 

  1)我們要對日期和產品編碼進行分組,並計算相同的產品的數量

    Sql語句:Select date, pnumber,sum(quantity) as total from orders,items group by date, pnumber(少了兩張表的關聯的條件)

    MongoDB:

       db.orders.group({

          key: { date:1,‘item.pnumber‘:1},

          initial : {"total":0},

         reduce : function Reduce(doc, out) {

        out.total+=doc.item.quantity

   } });

結果:

  

 

  2)實現一天賣出了多少個產品,金額是多少,平均價格是多少

    db.orders.group({

       key: {date:1},

      initial :{"total":0,"money":0},

     reduce : function Reduce(doc, out) {

     out.total+=doc.item.quantity;

          out.money+=doc.item.quantity*doc.item.price;

        },

    finalize : function Finalize(out) {

         out.avg=out.money/out.total

         returnout;

    }

  });

 結果:

    

 3)keyf的使用

   keyf 對日期進行處理並以作為key來進來分組

 

 db.orders.group({

   keyf: function (doc){

   return{‘month‘:doc.date.getMonth()+1};

 },

 initial :{"total":0,"money":0},

 reduce : function Reduce(doc, out) {

    out.total+=doc.item.quantity;

          out.money+=doc.item.quantity*doc.item.price;

        

},

 finalize : function Finalize(out) {

         out.avg=out.money/out.total

         returnout;

  }

});

結果:

  

 

三.Java MongoDB 實現       Spring Data MongoDB 提供了Group有幾個介面              GroupCommand  groupCommand=new GroupCommand(inputCollection, keys, condition, initial, reduce, finalize); 

 

    1)我們要對日期和產品編碼進行分組,並計算相同的產品的數量

           

[java] view plain copy 
  1. <strong>  </strong>     @Override  
  2.     public void getGroupCount(String collectionName) {  
  3.           
  4.         BasicDBObject key = new BasicDBObject();   
  5.         key.put("date", 1);  
  6.         key.put("item.pnumber", 1);  
  7.         //條件  
  8.         BasicDBObject cond = new BasicDBObject();    
  9.         //初始化  
  10.         BasicDBObject initial = new BasicDBObject();    
  11.         initial.append("total", 0);    
  12.         //reduce  
  13.         String reduce = "function Reduce(doc, out) { " +    
  14.                 "  out.total+=doc.item.quantity;" +    
  15.                 "}";    
  16.           
  17.         SimpleDateFormat format=new SimpleDateFormat("yyyy-mm-dd");  
  18.         BasicDBList groupList=(BasicDBList) mongoTemplate.getCollection(collectionName).group(key, cond, initial, reduce);  
  19.         if(groupList!=null&&groupList.size()>0){  
  20.             System.out.println("date  item.pnumber  total");  
  21.             for(int i=0;i<groupList.size();i++){   
  22.                 BasicDBObject obj=(BasicDBObject) groupList.get(i);  
  23.                 System.out.println(format.format(obj.getDate("date"))+"  "+obj.getString("item.pnumber")+"  "+obj.getInt("total"));  
  24.             }  
  25.         }  
  26.     }  

結果:

 

   

 

   2)實現一天賣出了多少個產品,金額是多少,平均價格是多少

      

[java] view plain copy 
  1.        @Override  
  2. public void getGroupAvg(String collectionName) {  
  3.       
  4.     BasicDBObject key = new BasicDBObject();   
  5.     key.put("date", 1);  
  6.       
  7.     //條件  
  8.     BasicDBObject cond = new BasicDBObject();    
  9.     //初始化  
  10.     BasicDBObject initial = new BasicDBObject();    
  11.     initial.append("total", 0);   
  12.     initial.append("money", 0.0);  
  13.       
  14.     //reduce  
  15.     String reduce = "function Reduce(doc, out) { " +    
  16.             "  out.total+=doc.item.quantity;" +   
  17.             "   out.money+=doc.item.quantity*doc.item.price;" +  
  18.             "}";   
  19.       
  20.     String finalize="function Finalize (out) { " +    
  21.         "  out.avg=out.money/out.total;" +   
  22.         "   return out;" +  
  23.         "}";          
  24.     SimpleDateFormat format=new SimpleDateFormat("yyyy-mm-dd");  
  25.     BasicDBList groupList=(BasicDBList) mongoTemplate.getCollection(collectionName).group(key, cond, initial, reduce, finalize);  
  26.     if(groupList!=null&&groupList.size()>0){  
  27.         System.out.println("date  total  money  avg");  
  28.         for(int i=0;i<groupList.size();i++){   
  29.             BasicDBObject obj=(BasicDBObject) groupList.get(i);  
  30.             System.out.println(format.format(obj.getDate("date"))+"  "+obj.getInt("total")+"  "+obj.getInt("money")+"  "+obj.getDouble("avg"));  
  31.         }  
  32.     }  
  33.       
  34. }  

結果:

 

   

MongoDB 彙總Group(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.