正常的sql語句爲
select financing ,count(financing) ,avg(live_days)/30
from company
GROUP BY financing
正常的mongodb語句爲
db.getCollection("data").aggregate([
{$group:{_id:"$financing",counter:{$sum:1},num_tutorial:{$avg:'$live_days'}}}
])
但是其中live_days爲String類型字段,不能進行avg,所以只能單拿出來用java語句單獨求平均值
//連接數據庫
MongoClient mongoClient = new MongoClient( "localhost", 27017);
MongoDatabase databasee = mongoClient.getDatabase("temp");
MongoCollection<Document> collection = databasee.getCollection("data");
List<Back_data> list= new ArrayList<Back_data>();
//mongodb聚合函數,相當於sql中的select financing ,count(financing) from company GROUP BY financing
Document info_group = new Document();
info_group.put("_id", "$financing");
info_group.put("count", new Document("$sum",1));
Document group = new Document("$group", info_group);
List<Document> aggregateList = new ArrayList<Document>();
aggregateList.add(group);
//mongodb聚合函數開始執行,並讀取文件內容
AggregateIterable<Document> resultset = collection.aggregate(aggregateList);
MongoCursor<Document> cursor = resultset.iterator();
int time = 0;
while(cursor.hasNext()) {
//記錄循環次數,相當於記錄數據庫中查詢到的記錄的數量
time++;
Document item_doc = cursor.next();
String leaveMethod = item_doc.getString("_id");
int count = item_doc.getInteger("count", 0);
//獲得id和記錄count數,並存入user類之中,再添加到列表裏
Back_data user = new Back_data();
user.setName(leaveMethod);
user.setNumber(count);
list.add(user);
}
//此處爲處理字段(live_days)爲String的求平均值avg的方法
//循環每一條記錄
for(int i=0;i<time;i++) {
int sum = 0;
int num = 0;
Document query3 = new Document();
//從已經聚合好的financing字段進行查詢
query3.put("financing",list.get(i).getName());
//查詢每一條記錄的live_days的值
MongoCursor<Document> result = collection.find(query3).iterator();
//讀取live_days的值,並加在一起
while (result.hasNext()) {
num++;
Document dbObject = (Document) result.next();
sum = sum + Integer.parseInt(dbObject.getString("live_days").toString())/30;
}
//求live_days的平均值
sum = sum/num;
//把結果存儲到list列表之中
list.get(i).setValue(sum);
}
mongoClient.close();
使用sql數據庫就不用擔心這個問題了,下面是sql的寫法
Connection conn=null;
PreparedStatement stmt=null;
ResultSet rs =null;
String sql = "select financing as 'a',count(financing) as 'b',avg(live_days)/30 as 'c' from company GROUP BY financing";
try
{
List<Back_data> list= new ArrayList<Back_data>();
conn = JdbcUtil.getConnection();
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
int time=0;
while(rs.next()){
time++;
Back_data user = new Back_data();
user.setName(rs.getString("a"));
user.setNumber(rs.getInt("b"));
user.setValue(rs.getInt("c"));
list.add(user);
}
return list;
}
catch(Exception e)
{
throw new RuntimeException(e);
}
finally
{
JdbcUtil.release(rs, stmt, conn);
}