group分组统计是数据库比较常用的功能,mongodb也不例外。不过相对于普通的增删改查,group操作就略微麻烦一些,
这里对group在shell中的操作、使用java原生代码操作以及集成spring进行操作进行一个简单的归纳总结,分组的途径和方法应该都有多种,这里每一样只举一例。

本例中数据源如下:
mongodb命令行group分组和java代码中group分组

需要使用group实现的目的是:按年龄分组统计出每一组的数量。

1、mongo shell中执行如下命令:

  1. db.test.group({  
  2.     key:{"age":1},  
  3.     initial:{"count":0},  
  4.    $reduce:function(doc,out){ out.count++; } ,  
  5.    $finalize:function(out){ return out; }  
  6.  }  
  7.  )  

执行代码及结果如图:
mongodb命令行group分组和java代码中group分组

2、java原生代码进行上述操作:

  1. public class MonTest {  
  2.     public static void main(String[] args) {  
  3.         monGroup();  
  4.     }  
  5.     public static void monGroup() {  
  6.         ServerAddress sa = new ServerAddress("192.168.0.201"37017);  
  7.         List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>();  
  8.         mongoCredentialList.add(MongoCredential.createMongoCRCredential("admin""admin""123456".toCharArray()));  
  9.         Mongo client = new MongoClient(sa, mongoCredentialList);  
  10.         DB database = client.getDB("admin");  
  11.         DBCollection coll = database.getCollection("test");  
  12.         DBObject keys = new BasicDBObject("age"1);  
  13.         DBObject condition = null;  
  14.         DBObject initial = new BasicDBObject("count"0);  
  15.         String reduce = "function(doc,out){out.count++;}";  
  16.         String finalize = "function(out){return out;}";  
  17.         BasicDBList dbList = (BasicDBList) coll.group(keys, condition, initial, reduce, finalize);  
  18.         if (dbList != null) {  
  19.             for (int i = 0; i < dbList.size(); i++) {  
  20.                 DBObject obj = (DBObject) dbList.get(i);  
  21.                 Object age = obj.get("age");  
  22.                 Object count = obj.get("count");  
  23.                 System.out.println("age:" + age + ",count:" + count);  
  24.             }  
  25.         }  
  26.     }  
  27. }  

执行结果如图:
mongodb命令行group分组和java代码中group分组

3、集成spring后的操作:


dao方法实现代码:
  1. /** 
  2.    * mongodb简单分组查询 
  3.    *  
  4.    * @author:tuzongxun 
  5.    * @Title: mongoGroup 
  6.    * @param @return 
  7.    * @date Jul 19, 2016 8:36:19 AM 
  8.    * @throws 
  9.    */  
  10.   @Override  
  11.   public BasicDBList mongoGroup() {  
  12.       // TODO Auto-generated method stub  
  13.       GroupBy groupBy = GroupBy.key("age").initialDocument("{count:0}").reduceFunction("function(doc, out){out.count++}")  
  14.           .finalizeFunction("function(out){return out;}");  
  15.       GroupByResults<UserModel> res = mongoTemplate.group("test", groupBy, UserModel.class);  
  16.       DBObject obj = res.getRawResults();  
  17.       BasicDBList dbList = (BasicDBList) obj.get("retval");  
  18.       return dbList;  
  19.   }  


对应的实体model:
  1. package spring_mongo.models;  
  2. import java.io.Serializable;  
  3. public class UserModel implements Serializable {  
  4.     private static final long serialVersionUID = 1L;  
  5.     private String name;  
  6.     private int age;  
  7.   
  8.     public UserModel(String name, int age) {  
  9.         super();  
  10.         this.name = name;  
  11.         this.age = age;  
  12.     }  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.   
  22.     public int getAge() {  
  23.         return age;  
  24.     }  
  25.   
  26.     public void setAge(int age) {  
  27.         this.age = age;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "UserModel [name=" + name + ", age=" + age + "]";  
  33.     }  
  34.   
  35. }  

junit测试方法:
  1. @Test  
  2.     public void mongoGroup() {  
  3.         BasicDBList dbList = userDao.mongoGroup();  
  4.         if (dbList != null) {  
  5.             for (int i = 0; i < dbList.size(); i++) {  
  6.                 DBObject obj = (DBObject) dbList.get(i);  
  7.                 Object age = obj.get("age");  
  8.                 Object count = obj.get("count");  
  9.                 System.out.println("age:" + age + ",count:" + count);  
  10.             }  
  11.         }  
  12.     }  

运行结果如图:
mongodb命令行group分组和java代码中group分组


相关文章:

  • 2021-04-07
  • 2022-12-23
  • 2021-10-22
  • 2022-12-23
  • 2022-12-23
  • 2021-07-25
  • 2021-12-26
猜你喜欢
  • 2021-11-15
  • 2021-12-24
  • 2021-08-29
  • 2022-01-27
  • 2021-04-18
相关资源
相似解决方案