这是我参与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,图搜索
- 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 中,还提供了聚合操作的管道枸酱哦哦那个剧,可以可视化地进行剧和操作管道的构建,并且可以分步查看结果数据集合: