官术网_书友最值得收藏!

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)行排序。

主站蜘蛛池模板: 宾阳县| 应用必备| 如皋市| 宝兴县| 阿拉善右旗| 娄烦县| 黄陵县| 阿拉善左旗| 晋宁县| 卢氏县| 比如县| 海淀区| 鄂尔多斯市| 衡南县| 怀化市| 八宿县| 云南省| 新兴县| 莱阳市| 玛沁县| 黄大仙区| 壶关县| 闻喜县| 襄垣县| 通州区| 兴山县| 万源市| 乌兰察布市| 定兴县| 申扎县| 和政县| 习水县| 蒲江县| 古田县| 芦山县| 专栏| 比如县| 海口市| 柏乡县| 辽阳县| 汉阴县|