mongo聚合之後求平均值avg,求和的字段是string類型該怎麼辦

正常的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);	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章