最近项目中遇到需要对查询出来的数据进行分组统计,用到了聚合查询,之前都是用代码进行统计。因为我以前一直有一个误区就是轻易不要实用聚合查询,因为当数据量超过一定程度,mongoose 就会保错,所以最近阅读了一下官方文档,解决我的疑惑。 Aggreagte 使用聚合查询之前,我们要搞清楚这里面的操作符都是干嘛的。 $macth 匹配数据,根据给定的条件,过滤掉不符合条件的数据。 $group 进行分组统计,相当于 SQL 中的 group 分组操作 $project 投影操作符,指定需要显示的字段 $sort 对聚合管道中的数据按照指定字段排序 $limit 限制返回的数量 $skip 跳过指定数量的文档,并返回剩下的文档 $unwind 按照指定的字段拆分文档 $addFiles 根据需要,添加新的字段 以上是一些常用的操作符,这里要注意的是再使用聚合查询时,要根据数据量的大小来确定使用,因为在文档中有这么一段话 The $group stage has a limit of 100 megabytes of RAM. By default, if the stage exceeds this limit, $group will produce an error. However, to allow for the handling of large datasets, set the allowDiskUse option to true to enable $group operations to write to temporary files. See db.collection.aggregate() method and the aggregate command for details. 翻译过来就是 $group 阶段内存限制是 100MB 大小的数据,如果超出此限制,将会产生错误。但是,要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$ group操作以写入临时文件。 所以在使用之前预估一下要处理的数据量是否超过 100MB,是否需要开启 allowDiskUse,即允许磁盘缓存。 MongoDB 的内存限制是 100MB,聚合阶段每个管道不能超过 16M。 在分组时,只能用提供的操作符,如果想自定义字段,需要在下一个管道,使用 $addFiels 添加字段,然后把上一个管道返回来的数据赋给字段。 MongoDB 提供的操作符还有很多,这里只是我经常使用的几个,如果有别的需求,可以去看看官方文档。 (责任编辑:IT) |