文章目录
Mongoose: aggregate() 方法实现聚合函数
需求描述
首先我有一个 Item 的 collection:
1 | type Item { |
gql 端调用的方法:
1 | { |
然按照其中的类别 (itemtype) 进行总计:
那么实际上在后台 mongoose 里面需要这么写:
1 | getItemSummary: root => Item.aggregate([ |
聚合函数 aggregate() 的使用
首先写明按照哪个 field
进行聚合
1 | $group: { |
因为 $group 里面对应需要聚合操作的列必须写成 _id
, 否则会出现 The field 'xxx' must be an accumulator object
的报错信息
聚合管道
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
基本上就是逐个执行聚合方法里面的方法.
上方的聚合函数仅仅执行了对一个 field 的聚合:
1 | Item.aggregate([ |
但是实际上可以在这些操作之前之后加更多的操作.
比如想要将,70分到90分之间的数据先筛选出来再进行 group:
1 | db.articles.aggregate([ |
常用的几个操作
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
实例
$project 实例
0 为不显示,1为显示,默认情况下 _id 字段是 1
1 | db.articles.aggregate({ |
$match 实例
$match 用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
1 | db.articles.aggregate([ |
$skip 实例
经过 $skip 管道操作符处理后,前2个文档被"过滤"掉。
1 | db.col_1.aggregate({ $skip: 2 }); |