MongoDB 中的聚合查询和 MapReduce 操作的区别

阅读时长 4 min read

聚合查询

聚合查询允许将多个文档组合起来,通过统计、分组和筛选等操作,得出复杂的查询结果。MongoDB 提供了强大的聚合查询功能,在数据分析和数据挖掘等领域越来越受到开发者的青睐。

MongoDB 中的聚合查询主要由以下几个阶段组成:

  • $match 阶段:用于筛选符合条件的文档。
  • $group 阶段:用于对文档进行分组统计。
  • $project 阶段:用于对文档进行投影,即只返回需要的字段。
  • $sort 阶段:用于按照指定的字段进行排序。
  • $limit$skip 阶段:用于限制返回结果的数量和起点位置。

下面是一个简单的聚合查询示例,查询 students 集合中每个班级的平均分数:

  • db.students:表示查询 students 集合。
  • $group 阶段:以 class 字段进行分组,计算每个班级的平均 score 分数。
  • $project 阶段:不需要投影,因为只需要 _idavg_score 两个字段。
  • $sort 阶段:不需要排序。
  • $limit$skip 阶段:不需要限制返回结果的数量和起点位置。

一些其他的聚合管道操作有$unwind,$lookup, $replaceRoot, $facet等,这里不再赘述。

MapReduce 操作

MapReduce 是一种广泛应用于数据处理的算法,它由 Google 发明,用于在大规模数据集上进行分布式计算。在 MongoDB 中,MapReduce 操作用于对集合中的文档集合进行分组、过滤、排序和总结,生成汇总结果。MapReduce 操作可以处理复杂的数据集合,并支持自定义 JavaScript 函数。但是,它相对于聚合查询来说,更加复杂和低效。

MapReduce 操作由以下两个阶段组成:

  • Map 阶段:将输入数据转换为键值对,即 (key, value) 的形式。
  • Reduce 阶段:根据输入键值对,计算输出结果。

下面是一个简单的 MapReduce 示例,查询 students 集合中每个班级的平均分数:

-- -------------------- ---- -------
--- ------- - ---------- -
  ---------------- ------- ----------- ------ ----
--

--- ---------- - ------------- ------- -
  --- --- - --
  --- ----- - --

  ---------------------------- -
    ----- -- ----------
    --- -- ----------
  ---

  ------ ----------- -----------
--

----------------------
  --------
  -----------
  ----- --------------
--

----------------------
  • mapFunc 函数:以 class 作为键,scorecount 作为值。
  • reduceFunc 函数:根据输入键值对,计算输出的平均分数。
  • db.students.mapReduce:查询 students 集合,执行 MapReduce 操作。
  • {out: "temp_result"}:将结果保存到临时集合 temp_result 中。
  • db.temp_result.find():查询 temp_result 集合,查看结果。

MapReduce 操作的代码有些繁琐,复杂查询结果的计算也相对慢些,但是它可以处理更复杂和灵活的数据分析需求。对大量数据的处理过程中将调用多次 MapReduce 操作是低效的,使用聚合查询可以更好地解决这个问题。

总结

MongoDB 中的聚合查询和 MapReduce 操作都是用于处理数据的工具,两者的使用场景不同。

  • 聚合查询主要用于对数据进行汇总统计。它易于编写和理解,能够处理小到中等规模的数据集并支持更多操作。
  • MapReduce 操作则更适用于大规模数据集的处理,或者需要自定义 JavaScript 函数的数据分析需求。

在实际工作中,应该根据具体场景选择不同的数据处理工具,以达到更好的效果。

Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/64a844d948841e98944d5f39

Feed
back