MongoDB 聚合框架使用

323 阅读2分钟

这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战

MongoDB 的聚合框架是一个非常实用的工具,可以作用在一个或多个集合上,对集合中的数据进行一系列运算,类似于 SQL 的 where、join、group by、limit 等操作,或者 Java 中的 Lambda 操作。

整个剧和运算的过程,可以包含单个操作步骤,也可以包含多个。这一个或多个步骤,组成一个管道,对数据集合进行操作,如下:

pipeline = [$stage1, $stage2, ...$stageN];
db.<COLLECTION>.aggregate( pipeline, { options } );

MongoDB 中常见的聚合操作包括:

  • $match,过滤,类似 WHERE
  • $project,投影,类似 AS
  • $sort,排序,类似 ORDER BY
  • $group,分组,类似 GROUP BY
  • $skip/$limit,结果限制,类似 SKIP/LIMIT
  • $lookup,左外连接,类似 LEFT OUTER JOIN

以上这些步骤中,以 $match 为例,可以理解为匹配,类似 SQL 中的 where 操作,它在 MongoDB 中支持这种个样的运算符,比如:$eq$gt$gte$lt$lte$and$or$not$in$geoWithin 等。

除了这些常见的步骤,还有几个实用的,比如:

  • $unwind,展开数组
  • $graphLookup,图搜索
  • facet/facet/bucket,分面搜索

我们看一个例子:

db.scores.findOne()
{ name:'小明', score:[
    {subject:'语文',score:84},
    {subject:'数学',score:90},
    {subject:'外语',score:69}
]}

以上是一个学生考试成绩的集合当中的一条数据,利用 $unwind 操作,可以将结果对象中的 score 数组展开,使其变成三条数据:

db.students.aggregate([{$unwind: '$score'}])
{name: '张三', score: {subject: '语文', score: 84}}
{name: '张三', score: {subject: '数学', score: 90}}
{name: '张三', score: {subject: '外语', score: 69}}

以上代码中,的关键部分就是 .aggregate([{$unwind: '$score'}]) 操作,aggregate 函数就是用来执行聚合操作的,其中包含一个参数,是一个数组,数组中包含的是每一个操作,上面的例子中,{$unwind: '$score'} 就是剧和操作中的一个步骤,如果一个剧和操作包含多个步骤,可以将这些步骤都放到这个数组中,执行即可。

当你的聚合操作变得越来越复杂,为了方便开发者开发复杂的聚合操作的流水线管道,并进行分步骤的调试,在 MongoDB 官方提供的工具 MongoDB Compase 中,还提供了聚合操作的管道枸酱哦哦那个剧,可以可视化地进行剧和操作管道的构建,并且可以分步查看结果数据集合:

image.png