- MongoDB進(jìn)階與實(shí)戰(zhàn):微服務(wù)整合、性能優(yōu)化、架構(gòu)管理
- 唐卓章
- 585字
- 2021-05-19 17:44:40
2.7 使用聚合
接下來(lái),是時(shí)候?qū)ook集合中的數(shù)據(jù)做一下統(tǒng)計(jì)了,這里我們關(guān)心的數(shù)據(jù)有兩組:
● 每個(gè)分類的book文檔數(shù)量。
● 標(biāo)簽的熱度排行,標(biāo)簽的熱度則按其關(guān)聯(lián)book文檔的收藏?cái)?shù)(favCount)來(lái)計(jì)算。
對(duì)于這兩組數(shù)據(jù),我們都可以利用MongoDB的聚合框架(aggregation framework)來(lái)完成計(jì)算。
1.第一組數(shù)據(jù)
為了計(jì)算每個(gè)分類下的book文檔數(shù)量,需要將group作為主要的算子,代碼如下:

輸出結(jié)果為:

解釋:聚合是通過(guò)管道的形式來(lái)定義的,一個(gè)管道包含多個(gè)處理階段(stage)。上面的命令中僅涉及兩個(gè)階段(stage)——group(分組)和sort(排序),其中:
(1)group階段實(shí)現(xiàn)了按指定字段(type)的分組計(jì)算,sum:1表示按每個(gè)文檔累計(jì)1進(jìn)行統(tǒng)計(jì)。
(2)sort階段在分組之后,接收分組計(jì)算的輸出,并負(fù)責(zé)完成排序。
2.第二組數(shù)據(jù)
統(tǒng)計(jì)標(biāo)簽(tag)的熱度排行,其中,標(biāo)簽的熱度按照book文檔的收藏?cái)?shù)(favCount)來(lái)計(jì)算。相對(duì)第一組數(shù)據(jù)來(lái)說(shuō),這組計(jì)算需要考慮更多的差異:
(1)與分類(type)不同,標(biāo)簽被設(shè)計(jì)為一個(gè)多值(數(shù)組)的字段。
(2)對(duì)于沒(méi)有被收藏的book文檔(favCount=0),可以不進(jìn)行計(jì)算。
最終的聚合操作如下:

執(zhí)行結(jié)果為:

解釋:第二組數(shù)據(jù)的聚合操作中,定義了4個(gè)階段,分別如下。
(1)$match階段:用于過(guò)濾favCount=0的文檔。
(2)$unwind階段:用于將標(biāo)簽數(shù)組進(jìn)行展開(kāi),這樣一個(gè)包含3個(gè)標(biāo)簽的文檔會(huì)被拆解為3個(gè)條目。
(3)groups階段:對(duì)拆解后的文檔進(jìn)行分組計(jì)算,sum:"$favCount"表示按favCount字段進(jìn)行累加。
(4)$sort階段:接收分組計(jì)算的輸出,按total得分進(jìn)行排序。
- Deploying Node.js
- Advanced Machine Learning with Python
- 樂(lè)學(xué)Web編程:網(wǎng)站制作不神秘
- 深入淺出Prometheus:原理、應(yīng)用、源碼與拓展詳解
- WSO2 Developer’s Guide
- Getting Started with PowerShell
- Mastering ServiceNow(Second Edition)
- Python算法從菜鳥(niǎo)到達(dá)人
- Jupyter數(shù)據(jù)科學(xué)實(shí)戰(zhàn)
- 大模型RAG實(shí)戰(zhàn):RAG原理、應(yīng)用與系統(tǒng)構(gòu)建
- Spring核心技術(shù)和案例實(shí)戰(zhàn)
- Go語(yǔ)言精進(jìn)之路:從新手到高手的編程思想、方法和技巧(1)
- Cybersecurity Attacks:Red Team Strategies
- Machine Learning in Java
- Android移動(dòng)開(kāi)發(fā)案例教程:基于Android Studio開(kāi)發(fā)環(huán)境