公司目前一部分數(shù)據在MongoDB中存儲猎提,很郁悶的是數(shù)據結構還比較復雜巴比,所以在做聚合操作時比較費勁适荣。
下面兩段代碼足以應付負載查詢了
這是公司的數(shù)據結構
{
? ? "_id" : ObjectId("5c36afcea856498115161c5e"),
? ? "startDate" : ISODate("2019-01-10T02:34:00.000Z"),
? ? "endDate" : ISODate("2019-01-10T02:37:00.000Z"),
? ? "frequentness" : 1,
? ? "resultList" : [
? ? ? ? {
? ? ? ? ? ? "officeCode" : "AA",
? ? ? ? ? ? "fltNum" : "EE",
? ? ? ? ? ? "fltDate" : ISODate("2019-02-16T10:30:00.000Z"),
? ? ? ? ? ? "segOrgn" : "BB",
? ? ? ? ? ? "segDstn" : "CC",
? ? ? ? ? ? "paxId" : "104c060edd3b36447f8c954ed0218b3f",
? ? ? ? ? ? "pnr" : "DD",
? ? ? ? ? ? "eventCode" : "Issue",
? ? ? ? ? ? "eventTime" : ISODate("2019-01-10T02:34:03.000Z"),
? ? ? ? ? ? "expireDate" : ISODate("2019-01-12T02:34:03.906Z")
? ? ? ? }
}
mango做聚合操作
sql?
select?officeCode,segOrgn,segDstn,count(num) from?agent?
group?officeCode,segOrgn,segDstn,count(num)
order by?num
mango
db.getCollection('agent').aggregate([ {$group: {_id : {"officeCode":"$officeCode", "segOrgn":"$segOrgn"噪生,"segDstn:$segDstn"}, num: {$sum : 1}}} ])
java
public List<AgentDO1> aggregate()
{
Aggregation aggregation1 = Aggregation.newAggregation(Aggregation.group("officeCode:$officeCode","segOrgn:$segOrgn","segDstn:$segDstn").count().as("num"));
AggregationResults<AgentDO1> outputTypeCount1 =
? ? ? ? mongoTemplate.aggregate(aggregation1, "agent", AgentDO1.class);
List<AgentDO1> tagCount = outputTypeCount1.getMappedResults();
return tagCount;
}
mango有子列表做聚合操作復雜查詢
sql?
select?startDate,endDate,frequentness,count(num),resultList.officeCode, resultList.segOrgn,resultList.segDstn
from?agent?
where?startDate >=? and?startDate<?
group by ?startDate,endDate,frequentness,count(num)
order by?num
注意:
resultList是一個文檔中的文檔阵翎,還有就是返回的救國不能保存在resultList下面的屬性中逢并!
所以沒有辦法我只能再從新建一個DO專門負責存儲聚合后的結果,然后再再java里轉化成我需要的數(shù)據結構郭卫。
目的:如果不聚合數(shù)據直接讀取在用java代碼聚合會浪費大量的內存以及在傳輸時候的資源砍聊,說白了就是得到處理結果得到的時間可能會高達好幾分鐘。
java
@Override
public List<SalesExceptionMidResultDO> findAllDataByStartDateAndEndDate(Date startDate, Date endDate) {
// TODO Auto-generated method stub
Aggregation aggregation1 = Aggregation.newAggregation(Aggregation.unwind("resultList"),
Aggregation.match(Criteria.where("endDate").gt(startDate).lt(endDate)),
Aggregation.group("startDate:$startDate","endDate:$endDate","frequentness:$frequentness","eventCode:$resultList.eventCode","officeCode:$resultList.officeCode", "segOrgn:$resultList.segOrgn", "segDstn:$resultList.segDstn").count().as("num"));
AggregationResults<SalesExceptionMidResultDO> outputTypeCount1 = mongoTemplate.aggregate(aggregation1,
"sales_exception", SalesExceptionMidResultDO.class);
List<SalesExceptionMidResultDO> tagCount = outputTypeCount1.getMappedResults();
return tagCount;
}
這里有一個關于時間查詢的例子 因為普通的時候和mango里的時間不太一樣會差8個小時贰军!
db.getCollection('sales_exception').find({ "startDate" :
{ "$gte" : ISODate("2019-01-08T09:00:00Z"), "$lt" : ISODate("2019-01-08T12:00:00Z") }})
包括函數(shù)關聯(lián)聚合查詢