mongodb之(4)mongodb聚合管道

1埋同、聚合查詢

聚合查詢主要使用聚合框架對集合中的文檔進(jìn)行變換與組合凶赁,以實現(xiàn)對文檔的一連串處理。這些處理包含篩選(Filtering)致板、投射(projecting)咏窿、分組(grouping)集嵌、排序(sorting)、限制(limiting)和跳過(skipping)怜珍。
聚合操作通過管道操作符進(jìn)行處理咽块,每個操作符都會接受一連串的文檔侈沪,對這些文檔做一些類型轉(zhuǎn)換,最后將轉(zhuǎn)換后的文檔作為結(jié)果傳遞給下一個操作符瘦馍。不同的管道操作符可以按任意順序組合在一起情组,而且可以被重復(fù)任意多次箩祥。

1.1、$match

$match用于對文檔集合進(jìn)行篩選底瓣,之后就可以在篩選的帶的文檔子集上做聚合蕉陋。$match可以使用常規(guī)的查詢操作符,如$gt/$lt/$in等患民,但不能在$match中使用地理位置空間操作符垦梆。
通常在使用中應(yīng)盡可能將$match放在管道的前面位置。這樣好處為:一是可以快速將不需要的文檔過濾掉奶赔,以減少管道的工作量站刑;二是如果在投射和分組之前執(zhí)行$match鼻百,查詢可以使用索引。

使用示例:

> db.city.aggregate({"$match":{"code":{$lt:2}}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "name" : "北京", "country" : "中國", "code" : 1, "captial" : true, "people" : 20009000, "district" : [ "朝陽1", "通州", "海淀", "大興" ], "north" : true, "subId" : [ 1, 10, 20, 50, 100 ] }
>

1.2、$project

$project可以從文檔中提取字段勺爱,可以重命名字段,還可以在這些字段上進(jìn)行一些操作卫旱。$project最簡單的操作是選擇想要的字段顾翼,可以指定包含或不包含某個字段奈泪。同時涝桅,也可將投射過的字段進(jìn)行重命名。$fieldName在聚合框架中的含義是引用某個字段的值蕊肥。

1.2.1晴埂、管道表達(dá)式

最簡單的$project表達(dá)式是包含和排除字段,以及字段名稱儒洛。也可以使用表達(dá)式將多個字面量和變量組合在一個值中使用卦停。文檔的id默認(rèn)是包含的恼蓬。
使用示例:

> db.city.aggregate({"$project":{"name":1,"code":1}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "name" : "北京", "code" : 1 }
{ "_id" : ObjectId("5de5ac646bba334fecac2f30"), "name" : "廣州", "code" : 3 }
{ "_id" : ObjectId("5de647f5b4cd9b14f46e0e30"), "name" : "上海", "code" : 2 }
>

1.2.2小槐、數(shù)學(xué)表達(dá)式

數(shù)學(xué)表達(dá)式可用于操作數(shù)值凿跳。指定一組數(shù)值,就可以使用數(shù)學(xué)表達(dá)式進(jìn)行操作了疆栏。
操作語法如下:

  • "$add":[ expr1 [ , expr2, … , exprN ] ]惫谤。這個操作符接受一個或多個表達(dá)式作為參數(shù)壁顶,將這些表達(dá)式相加。
  • "$subtract":[ expr1, expr2 ]石挂。接受兩個表達(dá)式作為參數(shù)博助,用第一個表達(dá)式減去第二個表達(dá)式作為結(jié)果。
  • "$multiply":[ expr1 [ , expr2, … , exprN ] ]痹愚。接受一個或多個表達(dá)式富岳,并將它們相乘。
  • "$divide":[ expr1, expr2 ]拯腮。接受兩個表達(dá)式窖式,用第一個表達(dá)式除以第二個表達(dá)式的商作為結(jié)果。
  • "$mod":[ expr1, expr2 ]动壤。接受兩個表達(dá)式作為萝喘,將第一個表達(dá)式作為除以第二個表達(dá)式得到的余數(shù)作為結(jié)果。

使用示例:

> db.city.aggregate({"$project":{"code+2":{"$add":["$code",2]},"code*2*2*2":{"$multiply":["$code",2,2,2]},"code%3":{"$mod":["$code",3]}}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "code+2" : 3, "code*2*2*2" : 8, "code%3" : 1 }
{ "_id" : ObjectId("5de5ac646bba334fecac2f30"), "code+2" : 5, "code*2*2*2" : 24, "code%3" : 0 }
{ "_id" : ObjectId("5de647f5b4cd9b14f46e0e30"), "code+2" : 4, "code*2*2*2" : 16, "code%3" : 2 }
>

1.2.3、日期表達(dá)式

聚合框架中包含了一些用于提取日期信息的表達(dá)式:"$year"阁簸、"$month"爬早、"$dayOfMonth"、"$dayOfWeek"启妹、"$dayOfYear"筛严、"$hour"、"$minute"饶米、"$second"桨啃。只能對日期類型的字段進(jìn)行日期操作,不能對數(shù)值類型的字段做日期操作檬输。

使用示例:

> db.city.aggregate({"$project":{"crete_year":{"$year":"$create_date"}, "create_week":{"$dayOfWeek":"$create_date"}}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "crete_year" : null, "create_week" : null }
{ "_id" : ObjectId("5de5ac646bba334fecac2f30"), "crete_year" : null, "create_week" : null }
{ "_id" : ObjectId("5de647f5b4cd9b14f46e0e30"), "crete_year" : 2019, "create_week" : 5 }
>

1.2.4照瘾、字符串表達(dá)式

字符串操作如下:

  • "$substr":[ expr, startOffset, numToReturn ]。這個操作會截取字符串的字串丧慈,startOffset為字節(jié)偏移量析命,- - - numToReturn為字節(jié)數(shù),expr為輸入字符串伊滋。
  • "$concat":[ expr1, [ , expr2, … , exprN ] ]碳却。將給定的字符串連接在一起返回結(jié)果;
  • "$toLower":expr笑旺。返回expr字符串的小寫形式;
  • "$toUpper":expr馍资。返回expr字符串的大寫形式筒主;

使用示例:

> db.city.aggregate({"$project":{"country_city":{"$concat":["$country","-","$name"]}}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "country_city" : "中國-北京" }
{ "_id" : ObjectId("5de5ac646bba334fecac2f30"), "country_city" : "中國-廣州" }
{ "_id" : ObjectId("5de647f5b4cd9b14f46e0e30"), "country_city" : "中國-上海" }
>

1.2.5、邏輯表達(dá)式

比較表達(dá)式:

  • "$cmp":[ expr1, expr2 ]鸟蟹。比較expr1和expr2乌妙。若相等,返回0建钥;若expr1<expr2藤韵,返回負(fù)數(shù);若expr1>expr2則返回正數(shù)熊经。
  • "$strcasecmp":[ string1, string2]泽艘。比較string1和string2,區(qū)分大小寫镐依。只對羅馬字符組成的字符串有效匹涮。
  • "$eq"、"$ne"槐壳、"$gt"然低、"$gte"、"$lt"、"$lte":[ expr1, expr2 ]雳攘。對expr1和expr2執(zhí)行相應(yīng)的比較操作带兜,返回比較的結(jié)果(true或false)。

布爾表達(dá)式:

  • "$and":[ expr1, [ , expr2, … , exprN ] ]吨灭。如果所有表達(dá)式的值都是true刚照,那就返回true,否則返回false沃于;
  • "$or":[ expr1, [ , expr2, … , exprN ] ]涩咖。只要有任意表達(dá)式為true,則返回true繁莹,否則返回false檩互。
  • "$not":expr。對expr取反咨演。

控制語句:

  • "$cond":[ booleanExpr, trueExpr, falseExpr]闸昨。如果booleanExpr的值時true,那就返回trueExpr薄风,否則返回falseExpr饵较。
  • "$ifNull":[ expr, replacementExpr]。如果expr是null遭赂,返回replacementExpr循诉,否則返回expr。

使用示例:

> db.city.aggregate({"$project":{"hugeCity":{"$eq":["$name","北京"]}}})
{ "_id" : ObjectId("5de52e826bba334fecac2f28"), "hugeCity" : true }
{ "_id" : ObjectId("5de5ac646bba334fecac2f30"), "hugeCity" : false }
{ "_id" : ObjectId("5de647f5b4cd9b14f46e0e30"), "hugeCity" : false }
>

1.3撇他、$group

$group操作可以將文檔依據(jù)特定字段的不同值進(jìn)行分組茄猫。

1.3.1、分組操作符

還有 61% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末困肩,一起剝皮案震驚了整個濱河市划纽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锌畸,老刑警劉巖勇劣,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異潭枣,居然都是意外死亡比默,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門卸耘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來退敦,“玉大人,你說我怎么就攤上這事蚣抗〕薨伲” “怎么了瓮下?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钝域。 經(jīng)常有香客問我讽坏,道長,這世上最難降的妖魔是什么例证? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任路呜,我火速辦了婚禮,結(jié)果婚禮上织咧,老公的妹妹穿的比我還像新娘胀葱。我一直安慰自己,他們只是感情好笙蒙,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布抵屿。 她就那樣靜靜地躺著,像睡著了一般捅位。 火紅的嫁衣襯著肌膚如雪轧葛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天艇搀,我揣著相機(jī)與錄音尿扯,去河邊找鬼。 笑死焰雕,一個胖子當(dāng)著我的面吹牛衷笋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矩屁,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼右莱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了档插?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤亚再,失蹤者是張志新(化名)和其女友劉穎郭膛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛悬,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡则剃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了如捅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棍现。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镜遣,靈堂內(nèi)的尸體忽然破棺而出己肮,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布谎僻,位于F島的核電站娄柳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏艘绍。R本人自食惡果不足惜赤拒,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诱鞠。 院中可真熱鬧挎挖,春花似錦、人聲如沸航夺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷存。三九已至墓造,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锚烦,已是汗流浹背觅闽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留涮俄,地道東北人蛉拙。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像彻亲,于是被迫代替她去往敵國和親孕锄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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