mongodb命令列group分組和java程式碼中group分組
阿新 • • 發佈:2018-12-24
group分組統計是資料庫比較常用的功能,mongodb也不例外。不過相對於普通的增刪改查,group操作就略微麻煩一些,這裡對group在shell中的操作、使用java原生程式碼操作以及整合spring進行操作進行一個簡單的歸納總結,分組的途徑和方法應該都有多種,這裡每一樣只舉一例。本例中資料來源如下:
需要使用group實現的目的是:按年齡分組統計出每一組的數量。1、mongo shell中執行如下命令:
2、java原生程式碼進行上述操作:
執行結果如圖:
3、整合spring後的操作:dao方法實現程式碼:
對應的實體model:
junit測試方法:
執行結果如圖:
需要使用group實現的目的是:按年齡分組統計出每一組的數量。1、mongo shell中執行如下命令:
db.test.group({
key:{"age":1},
initial:{"count":0},
$reduce:function(doc,out){ out.count++; } ,
$finalize:function(out){ return out; }
}
)
執行程式碼及結果如圖:2、java原生程式碼進行上述操作:
public class MonTest { public static void main(String[] args) { monGroup(); } public static void monGroup() { ServerAddress sa = new ServerAddress("192.168.0.201", 37017); List<MongoCredential> mongoCredentialList = new ArrayList<MongoCredential>(); mongoCredentialList.add(MongoCredential.createMongoCRCredential("admin", "admin", "123456".toCharArray())); Mongo client = new MongoClient(sa, mongoCredentialList); DB database = client.getDB("admin"); DBCollection coll = database.getCollection("test"); DBObject keys = new BasicDBObject("age", 1); DBObject condition = null; DBObject initial = new BasicDBObject("count", 0); String reduce = "function(doc,out){out.count++;}"; String finalize = "function(out){return out;}"; BasicDBList dbList = (BasicDBList) coll.group(keys, condition, initial, reduce, finalize); if (dbList != null) { for (int i = 0; i < dbList.size(); i++) { DBObject obj = (DBObject) dbList.get(i); Object age = obj.get("age"); Object count = obj.get("count"); System.out.println("age:" + age + ",count:" + count); } } } }
執行結果如圖:
3、整合spring後的操作:dao方法實現程式碼:
/** * mongodb簡單分組查詢 * * @author:tuzongxun * @Title: mongoGroup * @param @return * @date Jul 19, 2016 8:36:19 AM * @throws */ @Override public BasicDBList mongoGroup() { // TODO Auto-generated method stub GroupBy groupBy = GroupBy.key("age").initialDocument("{count:0}").reduceFunction("function(doc, out){out.count++}") .finalizeFunction("function(out){return out;}"); GroupByResults<UserModel> res = mongoTemplate.group("test", groupBy, UserModel.class); DBObject obj = res.getRawResults(); BasicDBList dbList = (BasicDBList) obj.get("retval"); return dbList; }
對應的實體model:
package spring_mongo.models; import java.io.Serializable; public class UserModel implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; public UserModel(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "UserModel [name=" + name + ", age=" + age + "]"; } }
junit測試方法:
@Test
public void mongoGroup() {
BasicDBList dbList = userDao.mongoGroup();
if (dbList != null) {
for (int i = 0; i < dbList.size(); i++) {
DBObject obj = (DBObject) dbList.get(i);
Object age = obj.get("age");
Object count = obj.get("count");
System.out.println("age:" + age + ",count:" + count);
}
}
}
執行結果如圖: