MongoDB进阶与实战:微服务整合、性能优化、架构管理
上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得分进行排序。