Mongodb自身的分组功能有许多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键等等,所以,常常需要把数据读入到java中进行分组。java分组的示例如下:
/**
* keyColumn : new String[]{"xxxName","xxxType"}
* condition : 查询条件 ,可为空
* initial : 分组统计初始变量,为空时自动为每列提供初始变量
* reduce : 记录处理function
* finalize : finalize函数,可为空
*/
public BasicDBList group(String[] keyColumn, DBObject condition,
DBObject initial, String reduce, String finalize) {
Mongo m=null;
try{
m = new Mongo( "192.168.1.105" , 27017 ); // 指定主机与端口
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
DB db = m.getDB( "mydb" ); // 取得指定的库
DBCollection coll = db.getCollection("myTbl"); //得到指定集合
DBObject key = new BasicDBObject();
for (int i = 0; i < keyColumn.length; i++) {
key.put(keyColumn[i], true);
}
condition = (condition == null) ? new BasicDBObject() : condition;
if (StringUtils.isEmpty(finalize)) {
finalize = null;
}
if (initial == null) { //定义一些初始变量
initial = new BasicDBObject();
for (int i = 0; i < keyColumn.length; i++) {
DBObject index = new BasicDBObject();
index.put("count", 0);
index.put("sum", 0);
index.put("max", 0);
index.put("min", 0);
index.put("avg", 0);
index.put("self", "");
initial.put(keyColumn[i], index);
}
}
BasicDBList resultList = (BasicDBList) coll.group(key, condition,
initial, reduce, finalize);
return resultList;
}
实现案例:
//任务统计
// @Action(value = "getTaskStatistic", results = { @Result(name = "success", type = "json", params = {
// "includeProperties", "jsonResult" }) })
public String getTaskStatistic() {
DBObject initial = new BasicDBObject();
DBObject index = new BasicDBObject();
index.put("count", 0);
index.put("taskStatus", "");
initial.put("taskStatus", index);
String reduce = "function (doc, out) { "
+ " out.taskStatus.count = out.taskStatus.count+=1; "
+ " out.taskStatus.inspectStatus = doc.taskStatus;"
+ "}";
BasicDBList group = (BasicDBList)group(new String[] { "taskStatus"}, null, initial, reduce, null);
return group.toString();
}
返回数据:
[ { "taskStatus" : { "count" : 4.0 , "taskStatus" : "Finished"}} , { "taskStatus" : { "count" : 3.0 , "taskStatus" : "Received"}} , { "taskStatus" : { "count" : 2.0 , "taskStatus" : "UnReceive"}}]实际上完全是在用java写分组了,所以非常麻烦,而Mongo自己的分组又限制太多,可以用润乾公司的集算器来完成这个工作,集算器提供了许多常用的结构化数据计算功能,相当于把本来要用java写的代码都写好了,直接用就可以。
如果用它读出Mongodb的数据,则分组变得非常简单,只需要一句代码即可完成,如:T.groups(colname;sum(colname):F1,count(1):F2)。而且集算器提供了JDBC式的访问接口,很容易集成到java主程序中。
/**
* keyColumn : new String[]{"xxxName","xxxType"}
* condition : 查询条件 ,可为空
* initial : 分组统计初始变量,为空时自动为每列提供初始变量
* reduce : 记录处理function
* finalize : finalize函数,可为空
*/
public BasicDBList group(String[] keyColumn, DBObject condition,
DBObject initial, String reduce, String finalize) {
Mongo m=null;
try{
m = new Mongo( "192.168.1.105" , 27017 ); // 指定主机与端口
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
DB db = m.getDB( "mydb" ); // 取得指定的库
DBCollection coll = db.getCollection("myTbl"); //得到指定集合
DBObject key = new BasicDBObject();
for (int i = 0; i < keyColumn.length; i++) {
key.put(keyColumn[i], true);
}
condition = (condition == null) ? new BasicDBObject() : condition;
if (StringUtils.isEmpty(finalize)) {
finalize = null;
}
if (initial == null) { //定义一些初始变量
initial = new BasicDBObject();
for (int i = 0; i < keyColumn.length; i++) {
DBObject index = new BasicDBObject();
index.put("count", 0);
index.put("sum", 0);
index.put("max", 0);
index.put("min", 0);
index.put("avg", 0);
index.put("self", "");
initial.put(keyColumn[i], index);
}
}
BasicDBList resultList = (BasicDBList) coll.group(key, condition,
initial, reduce, finalize);
return resultList;
}
实现案例:
//任务统计
// @Action(value = "getTaskStatistic", results = { @Result(name = "success", type = "json", params = {
// "includeProperties", "jsonResult" }) })
public String getTaskStatistic() {
DBObject initial = new BasicDBObject();
DBObject index = new BasicDBObject();
index.put("count", 0);
index.put("taskStatus", "");
initial.put("taskStatus", index);
String reduce = "function (doc, out) { "
+ " out.taskStatus.count = out.taskStatus.count+=1; "
+ " out.taskStatus.inspectStatus = doc.taskStatus;"
+ "}";
BasicDBList group = (BasicDBList)group(new String[] { "taskStatus"}, null, initial, reduce, null);
return group.toString();
}
返回数据:
[ { "taskStatus" : { "count" : 4.0 , "taskStatus" : "Finished"}} , { "taskStatus" : { "count" : 3.0 , "taskStatus" : "Received"}} , { "taskStatus" : { "count" : 2.0 , "taskStatus" : "UnReceive"}}]实际上完全是在用java写分组了,所以非常麻烦,而Mongo自己的分组又限制太多,可以用润乾公司的集算器来完成这个工作,集算器提供了许多常用的结构化数据计算功能,相当于把本来要用java写的代码都写好了,直接用就可以。
如果用它读出Mongodb的数据,则分组变得非常简单,只需要一句代码即可完成,如:T.groups(colname;sum(colname):F1,count(1):F2)。而且集算器提供了JDBC式的访问接口,很容易集成到java主程序中。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货