聚合管道
聚合框架是 MongoDB 中的一组分析工具,可以对一个或多个集合中的文档进行分析。
MongoDB 的聚合框架基于管道的概念:首先从集合中获取到输入,然后将输入的文档传递到一个或多个阶段,每个阶段都将之前阶段输出的内容作为输入,最终得到一个聚合结果作为输出。
上面的图是一个比较宽泛的管道流程图。这里展示一个 MongoDB 聚合语句映射到管道之后的情况:
在这里可以看得出,aggregate([{}, {}])
是一个聚合语句,在函数的数组中,每一个对象都是一个阶段,$match
应该就是一个筛选文档的阶段,$group
应该就是一个分组汇总的阶段。
管道阶段
使用聚合框架最重要的就是熟悉操作的语法,以及将这些语法构建成管道当中的阶段。
在 MongoDB 聚合框架中,每一个阶段都必须要规定一个特定的阶段运算符,这些阶段运算符表明了阶段的执行规则,可以到 官方文档 上查看更多、更详细的内容。
常见操作
最常见的操作应该是能与普通查询语句对应上的操作,如查询、投影、排序、跳过、限制等等。虽然这些在一个 find()
语句中就能实现。
最常使用的操作就是查询,也可以说是筛选、过滤,在聚合框架中使用 $match
来表明这是一个筛选文档的阶段。如下是其使用语法:
{ $match: { <query> } } |
第二个则是投影,这个阶段可以修改输入文档的结构,通常是重命名、增加、删除属性,也可以通过表达式创建计算结果以及嵌套文档。如下是其使用语法:
// <field>: <1 or true> |
|
// <field>: <0 or false> |
|
// <field>: <expression> |
|
{ $project: { <specification(s)> } } |
|
排序、跳过、限制都比较容易理解,实际上可以与 find()
结果的游标支持的函数做联系。如下是其使用语法:
// 排序 |
|
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } } |
|
// 跳过 |
|
{ $skip: <positive 64-bit integer> } |
|
// 限制 |
|
{ $limit: <positive 64-bit integer> } |
上述 5 个阶段是最常用的阶段,在使用时需要注重它们的效率