上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.7 使用聚合
接下来,是时候对book集合中的数据做一下统计了,这里我们关心的数据有两组:
● 每个分类的book文档数量。
● 标签的热度排行,标签的热度则按其关联book文档的收藏数(favCount)来计算。
对于这两组数据,我们都可以利用MongoDB的聚合框架(aggregation framework)来完成计算。
1.第一组数据
为了计算每个分类下的book文档数量,需要将group作为主要的算子,代码如下:
输出结果为:
解释:聚合是通过管道的形式来定义的,一个管道包含多个处理阶段(stage)。上面的命令中仅涉及两个阶段(stage)——group(分组)和sort(排序),其中:
(1)group阶段实现了按指定字段(type)的分组计算,sum:1表示按每个文档累计1进行统计。
(2)sort阶段在分组之后,接收分组计算的输出,并负责完成排序。
2.第二组数据
统计标签(tag)的热度排行,其中,标签的热度按照book文档的收藏数(favCount)来计算。相对第一组数据来说,这组计算需要考虑更多的差异:
(1)与分类(type)不同,标签被设计为一个多值(数组)的字段。
(2)对于没有被收藏的book文档(favCount=0),可以不进行计算。
最终的聚合操作如下:
执行结果为:
解释:第二组数据的聚合操作中,定义了4个阶段,分别如下。
(1)$match阶段:用于过滤favCount=0的文档。
(2)$unwind阶段:用于将标签数组进行展开,这样一个包含3个标签的文档会被拆解为3个条目。
(3)groups阶段:对拆解后的文档进行分组计算,sum:"$favCount"表示按favCount字段进行累加。
(4)$sort阶段:接收分组计算的输出,按total得分进行排序。