
文章插圖
通過前面幾篇的學(xué)習(xí),作為后端開發(fā)的我們基本可以應(yīng)付70%的開發(fā)場景 。接下來,我們就來看點(diǎn)進(jìn)階一點(diǎn)的東西,首先是聚合查詢 。
1 聚合框架簡介
前面的學(xué)習(xí)我們都是針對單個Collection操作的,雖然在MongoDB中針對Collection的設(shè)計就已經(jīng)是無模式的,因此我們大部分場景都是針對單個Collection進(jìn)行操作 。
但是,我們在實(shí)際應(yīng)用場景中還是會遇到想要SQL查詢中的 GROUP BY、LEFT OUTER JOIN、AS等操作 。
好在,MongoDB提供了一套聚合框架(Aggregation Framework),它可以幫助我們在一個或多個Collection上,對Collection中的數(shù)據(jù)進(jìn)行一系列的計算,并將這些數(shù)據(jù)轉(zhuǎn)化為期望的格式 。
整個聚合計算的過程也被稱之為管道(Pipeline),由多個步驟(Stage)組成,這一點(diǎn)和Jenkins Pipeline比較類似 。其中,每個管道需要:
(1)接受一系列Document(原始數(shù)據(jù))
(2)每個步驟對這些Document進(jìn)行一系列的運(yùn)算
(3)結(jié)果Document輸出給下一個步驟
整個管道的過程如下圖所示:

文章插圖
聚合計算的基本格式如下所示:
pipeline = [$stage1, $stage2, ...$stageN];db.<CollectionName>.aggregate(pipeline,{ options });2 聚合操作實(shí)例示例數(shù)據(jù)數(shù)據(jù)庫
這里我們使用《MongoDB入門實(shí)戰(zhàn)教程(3)》中使用Mongo Tools進(jìn)行恢復(fù)的Mock數(shù)據(jù)庫中的orders集合來進(jìn)行應(yīng)用 。

文章插圖
在orders集合中,約有100000條記錄 。
每個order文檔的數(shù)據(jù)模型如下所示:

文章插圖

文章插圖
練習(xí)1:目前為止的訂單總銷量
假設(shè)我們需要針對orders集合進(jìn)行一個操作,計算到目前為止的所有訂單的總銷售額:
db.orders.aggregate([{ $group:{_id: null,total: { $sum: "$total" }}}]);這里我們使用到了一個常見的步驟(Stage):$group,它和SQL中的GROUP BY等價,用于對數(shù)據(jù)進(jìn)行分組 。這里我們僅僅是做一個求和,不需要對誰進(jìn)行分組 。然后,我們還用到了一個分組步驟中常用的運(yùn)算符:$sum,它和SQL中的SUM等價,用于對指定列的數(shù)據(jù)進(jìn)行求和 。這里我們需要對total字段進(jìn)行一個求和 。
下圖是查詢結(jié)果:

文章插圖
練習(xí)2:某個日期區(qū)間的訂單金額匯總
假設(shè)我們需要查詢在2019年第一季度已完成訂單的訂單總金額和訂單總數(shù) 。
說明:第一季度為1月1日~3月31日,訂單狀態(tài)為completed 。
db.orders.aggregate([// 步驟1:匹配條件{ $match: { status: "completed", orderDate: {$gte: ISODate("2019-01-01"),$lt: ISODate("2019-04-01") } } },// 步驟二:聚合訂單總金額、總運(yùn)費(fèi)、總數(shù)量{ $group: {_id: null,total: { $sum: "$total" },shippingFee: { $sum: "$shippingFee" },count: { $sum: 1 } } },{ $project: {// 計算總金額grandTotal: { $add: ["$total", "$shippingFee"] },count: 1,_id: 0 } }])可以看到,這是一個較為復(fù)雜的查詢,我們可以將其分為三步:第一步,使用$match進(jìn)行匹配,這一點(diǎn)是做的SQL中的WHERE操作 。
第二步,使用$group進(jìn)行分組,目的是為了使用SUM運(yùn)算符求和 。
第三步,使用$project進(jìn)行投影,目的是選擇需要的或排除不需要的字段顯示 。
下圖是查詢結(jié)果:
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- mongodb是nosql數(shù)據(jù)庫嗎 5 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 7 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 8 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 9 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 11 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 12 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 13 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- mongodb是nosql數(shù)據(jù)庫嗎 14 NoSQL | MongoDB入門實(shí)戰(zhàn)教程
- 做雙眼皮有幾種方法
- 最有激情的健身運(yùn)動是什么
