MongoDB快速入門教程 (3.3)

3.4.聚合

#3.4.1.什么是聚合娘锁?

MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等)牙寞,并返回計(jì)算后的數(shù)據(jù)結(jié)果。有點(diǎn)類似sql語句中的 count(*)

image

例如上圖中一個集合中有9個文檔莫秆,通過count操作后碎税,輸出一個9,這種操作就是一個單一的聚合操作

#3.4.2.什么是聚合管道馏锡?

上面說到了單一的聚合操作雷蹂,那什么又是聚合管道呢?你可以把管道理解為流水線杯道,或者就是水管匪煌,把數(shù)據(jù)看作是水流,我們稱之為數(shù)據(jù)流党巾,管道中裝的都是數(shù)據(jù)萎庭,數(shù)據(jù)在管道中流動,數(shù)據(jù)在一個管道中經(jīng)過處理后可以傳遞到下一個管道齿拂,最終得到你想要的數(shù)據(jù)

請看官網(wǎng)例子:

image

在集合中有4條文檔數(shù)據(jù)驳规,經(jīng)過match操作后可以匹配出status為A的數(shù)據(jù),此時處理后的數(shù)據(jù)只剩3條署海,status為D的這條數(shù)據(jù)被過濾掉了吗购,緊接著医男,數(shù)據(jù)進(jìn)入下一個管道,此時交給group來處理捻勉,$group的作用是對文檔進(jìn)行分組镀梭,分組后又根據(jù)amount字段求和,所以id為A123的最終結(jié)果是750(500+250)

#3.4.3.如何使用聚合管道操作

#1.aggregate() 方法

這個方法就是用來具體執(zhí)行管道操作的踱启,具體語法如下:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)  

官網(wǎng)例子:

db.orders.aggregate([
  {$match: {status: "A"}},
  {$group: {_id: "$cust_id", total: {$sum: "$amount"}}}
])

aggregate方法中傳入一個數(shù)組报账,這個數(shù)據(jù)中的每個元素就是一次聚合操作,第一個元素的操作執(zhí)行完后會傳遞給下個元素執(zhí)行埠偿,每個元素都是一個對象透罢,對象中的key就是管道操作符,例如:{match: {status: "A"}},這里面的match就是管道操作符冠蒋,對象中的value值就是管道表達(dá)式,例如:{$match: {status: "A"}},這里面的{status: "A"}就是管道表達(dá)式

#2.常用管道操作符

管道操作符 功能描述
$project 修改輸入文檔的結(jié)構(gòu)琐凭。可以用來重命名浊服、增加或刪除域统屈,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔
$match 用于過濾數(shù)據(jù),只輸出符合條件的文檔
$limit 用來限制MongoDB聚合管道返回的文檔數(shù)
$skip 在聚合管道中跳過指定數(shù)量的文檔牙躺,并返回余下的文檔
$sort 條件排序
$group 將集合中的文檔分組愁憔,可用于統(tǒng)計(jì)結(jié)果
$lookup 用以引入其他集合的數(shù)據(jù),可以用來做關(guān)聯(lián)查詢

#3.管道表達(dá)式

前面我們已經(jīng)說過什么是管道表達(dá)式,例如:{_id: "cust_id", total: {sum: "amount"}}孽拷,每一個管道表達(dá)式都是對象的形式吨掌,里面也包含了key和value,key通常都是字段名脓恕,value就是字段值膜宋, 字段值里面可以是由表達(dá)式操作符組成的對象,例如:{sum: "amount"}炼幔,這個對象就是由表達(dá)式操作符組成的秋茫,其中,sum就是一個表達(dá)式操作符乃秀,用于求和運(yùn)算

常見的表達(dá)式操作符如下:

表達(dá)式操作符 功能描述
$addToSet 將文檔的指定字段的值去重
$max 求字段的最大值
$min 求字段的最小值
$sum 求和
$avg 求平均值
$gt 大于
$lt 小于
$eq 等于

#4.實(shí)際操作

準(zhǔn)備數(shù)據(jù)肛著,你可以將下列代碼直接拷貝到mongodb中執(zhí)行:

db.order.insert({"order_id":"1","uid":10001,"trade_no":"nd001","all_price":10,"all_num":9}) 
db.order.insert({"order_id":"2","uid":10002,"trade_no":"nd002","all_price":20,"all_num":8}) 
db.order.insert({"order_id":"3","uid":10003,"trade_no":"nd003","all_price":30,"all_num":7})
db.order_item.insert({"order_id":"1","title":"無線鼠標(biāo) 1","price":500,num:10}) 
db.order_item.insert({"order_id":"1","title":"無線鍵盤 2","price":600,num:11}) 
db.order_item.insert({"order_id":"1","title":"有線鍵盤 3","price":700,num:12})
db.order_item.insert({"order_id":"2","title":"蘋果","price":50,num:2}) 
db.order_item.insert({"order_id":"2","title":"香蕉","price":40,num:3})
db.order_item.insert({"order_id":"3","title":"牛奶","price":20,num:9}) 
db.order_item.insert({"order_id":"3","title":"面包","price":10,num:4})

image
#1.$project

通俗的說這個管道操作符可以用來篩選指定的字段

舉例:查詢出訂單信息,只顯示訂單號

db.order.aggregate([{$project:{_id: 0, order_id: 1}}])

#2.$match

通俗的說$match操作的作用就是查找滿足條件的數(shù)據(jù)

db.order.aggregate([{$project: {order_id: 1, all_price: 1}}, {$match: {"all_price": {$gt: 20}}}])

#3.$group

$group主要是用來進(jìn)行分組操作的

db.order_item.aggregate([{$group: {_id: "$order_id", total: {$sum: "$num"}}}])

注意:在使用$group的時候必須有一個_id作為分組的條件

#4.$sort

$sort的作用是用來進(jìn)行排序

db.order_item.aggregate([{$sort: {"price": -1}}])

注意: -1 表示降序跺讯, 1表示升序

#5.$limit

$limit的作用是限制顯示條數(shù)

db.order_item.aggregate([{$sort: {"price": -1}}, {$limit: 1}])

#6.$skip

$skip的作用是可以跳過的條數(shù)

db.order_item.aggregate([{$sort: {"price": -1}}, {$skip: 3}])

#7.$lookup

$lookup用來做關(guān)聯(lián)查詢枢贿,舉個例子:查詢order表中,order_id對應(yīng)的商品信息

db.order.aggregate([{$lookup:{from: "order_item", localField: "order_id", foreignField: "order_id"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刀脏,一起剝皮案震驚了整個濱河市局荚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖耀态,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轮傍,死亡現(xiàn)場離奇詭異,居然都是意外死亡茫陆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門擎析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來簿盅,“玉大人,你說我怎么就攤上這事揍魂〗按祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵现斋,是天一觀的道長喜最。 經(jīng)常有香客問我,道長庄蹋,這世上最難降的妖魔是什么瞬内? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮限书,結(jié)果婚禮上虫蝶,老公的妹妹穿的比我還像新娘。我一直安慰自己倦西,他們只是感情好能真,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扰柠,像睡著了一般粉铐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卤档,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天蝙泼,我揣著相機(jī)與錄音,去河邊找鬼劝枣。 笑死踱承,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哨免。 我是一名探鬼主播茎活,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琢唾!你這毒婦竟也來了载荔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤采桃,失蹤者是張志新(化名)和其女友劉穎懒熙,沒想到半個月后丘损,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡工扎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年徘钥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肢娘。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡呈础,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橱健,到底是詐尸還是另有隱情而钞,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布拘荡,位于F島的核電站臼节,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏珊皿。R本人自食惡果不足惜网缝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蟋定。 院中可真熱鬧途凫,春花似錦、人聲如沸溢吻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽促王。三九已至犀盟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝇狼,已是汗流浹背阅畴。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅耘,地道東北人贱枣。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像颤专,于是被迫代替她去往敵國和親纽哥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • MongoDB使用總結(jié) 數(shù)據(jù)庫操作 show dbs : 顯示所有的數(shù)據(jù)庫 use user : 選擇數(shù)據(jù)庫u...
    愛撒謊的男孩閱讀 1,137評論 0 3
  • 簡介 MongoDB 是一個基于分布式文件存儲的NoSQL數(shù)據(jù)庫 由C++語言編寫栖秕,運(yùn)行穩(wěn)定春塌,性能高 旨在為 WE...
    大熊_7d48閱讀 37,117評論 1 9
  • 簡介 NoSQL : 全名為Not Only SQL, 指的是非關(guān)系型的數(shù)據(jù)庫 隨著訪問量上升, 網(wǎng)站的數(shù)據(jù)庫性能...
    奮斗的老王閱讀 3,042評論 4 47
  • 如果我是一個太陽,我的能量,一定傳遞給需要的人只壳,她就會更加溫暖俏拱! 我希望自己是太陽,在寒冷的冬天里吼句,成為眾人期盼的...
    HR_欣姐閱讀 192評論 0 1
  • 思念是一種快樂的享受 它將心中的點(diǎn)點(diǎn)滴滴都釋放出來 隨風(fēng)雨飄然 帶起心中的一絲牽掛 思念是一種痛苦的煎熬 它把塵世...
    幽蘭33閱讀 167評論 0 1