聚合函数

聚合函数

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值、求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])Code language: CSS (css)

以上实例类似sql语句:

select by_user, count(*) from mycol group by by_userCode language: JavaScript (javascript)

在上面的例子中,通过字段 by_user 对数据进行分组,并计算 by_user 字段相同值的总和。

常用聚合表达式

表达式描述实例
$sum计算总和db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {sum:”likes”}}}])
$avg计算平均值db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {avg:”likes”}}}])
$min获取集合中所有文档对应值得最小值db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {min:”likes”}}}])
$max获取集合中所有文档对应值得最大值db.mycol.aggregate([{group : {_id : “by_user”, num_tutorial : {max:”likes”}}}])
$push在结果文档中插入值到一个数组中db.mycol.aggregate([{group : {_id : “by_user”, url : {push:”url”}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本db.mycol.aggregate([{group : {_id : “by_user”, url : {addToSet:”url”}}}])
$first根据资源文档的排序获取第一个文档数据db.mycol.aggregate([{group : {_id : “by_user”, first_url : {first:”url”}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{group : {_id : “by_user”, last_url : {last:”url”}}}])

示例

db.persons.aggregate([{$group : {_id : "$age", personscount : {$sum : 1}}}])
db.persons.aggregate([{$group : {_id : "$age", personscount : {$avg : 1}}}])Code language: CSS (css)

统计函数

db.persons.count()Code language: CSS (css)

计算总数。

db.persons.count({age:22})Code language: CSS (css)

先过滤再统计。

补充说明

  • aggregate() 接收的是一个管道数组,每个元素是一个阶段(stage),按顺序依次处理
  • group阶段中i​d指定分组字段,前缀 表示引用文档中的字段值
  • sum:1表示每组每匹配一条文档计数加1,等价于count(∗);sum : “$age” 表示对 age 字段求和
  • avg:1表示每组固定值1求平均,通常写成avg : “$age” 才有实际意义
  • push和addToSet 的区别:push允许重复值,addToSet 自动去重
  • first和last 依赖输入文档的顺序,通常需要先配合 $sort 阶段使用才有确定结果
  • count() 在 MongoDB 4.0+ 也支持用 db.collection.countDocuments() 替代,后者基于聚合实现,结果更可靠
db.persons.countDocuments()
db.persons.countDocuments({age:22})Code language: CSS (css)
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注