MongoDB的聚合功能使用

2021-07-06 10:16:03 字數 1385 閱讀 5948

mongodb的聚合功能的使用

我在專案中主要使用的資料庫是mongodb,版本為2.4.6,目前最新的版本為3.0(還沒有使用用,據說增加了很多新功能及改進)。

很久以前完成了乙個報表開發任務,用到了聚合,這裡就簡單的做了個記錄,也分享給其他人。projectmonthdata表(習慣稱集合為表)中儲存了每個月份的專案凍結資料,我選選取了某條記錄的部分字段值:

其中project_id對應了project表裡面的_id,org_id對應了organization表裡面的_id,month_investment_allocated是專案的部門投入費用,month_investment_designated是專案的研發投入費用,month_investment是專案的總費用,month_sales_cost是銷售支出費用,month_sales_revenue是銷售收益,month_sales_profit是銷售利潤,year是哪一年,month是哪個月,date是時間轉換成的long格式。

需求如下:介面上查詢報表是可以選擇某幾個月的,需要將同乙個專案不同月份的6中費用累加求和,聚合為一條資料。其中month_investment_allocated,month_investment_designated,month_investment相加小於0則這條記錄不參與聚合(這裡需求我都簡化了,實際開發比這個複雜,因為主要只看聚合部分)。

mongodb的collection有個方法是aggregate如下:aggregate(query,group),第乙個引數query是查詢的限制條件,也就是查詢符合哪些條件的資料,後面的引數group是可以有多個的,作為聚合分組。實際**如下;

//這是第乙個引數,也就是條件

這裡用json表示出來是這樣的:,

month_investment_designated:,

month_investment:]},

},}}}

表示的意思為:match去匹配month_investment_allocated、month_investment_designated、month_investment這三個值,值要大於0,緊接著要篩選出表中date欄位的值要大於給定的輸入時間,小於等於給定的結束時間,後面還有乙個限制條件表中的org_id欄位的值是給定的org_id的陣列。

這裡我就不寫json格式的了。

然後把這兩個引數傳入到目標方法aggregate中,aggregationoutput aggregate = prjmd.aggregate(match, group);

iteratoriter = aggregate.results().iterator();

這個itera中的dbobject型別的資料就是聚合出來的每一條新資料,然後遍歷取出裡面費用和_id,重新組合成新物件,就可以了。

詳細的下次會解釋。

vim功能使用

行首 0 fn 左箭頭 行尾 fn 右箭頭 文首 gg 文尾 g 某行 ng eg 4g表示游標跳到第四行 游標右移n字元 n eg 4表示游標右移4字元 刪除游標所在行 dd 刪除游標所在n行 ndd 刪除後乙個字元 x 刪除前乙個字元 x 刪除後n個字元 nx 刪除前n個字元 nx 複製游標所在...

Mysql裡不能使用聚合函式

採取的第一種方式 記錄一下關於mysql的乙個報錯問題解決方案 in aggregated query without group by,expression 1 of select list contains nonaggregated column yunva changke.u.user id...

MF CListControl 簡單功能使用

可檢視 todo 在此新增額外的初始化 ananlydata.modifystyle 0,lvs showselalways lvs ex gridlines lvs ex twoclickactivate ananlydata.setextendedstyle lvs ex flatsb 扁平風格...