MongoDB中的aggregate主要用于数据统计平均值,求和等,并返回计算后的数据结果,有点类似sql语句中的count,sum,avg功能。
一些表达式及对应功能:

表达式功能
$sum计算总和
$avg计算平均值
$min获取集合文档中最小值
$max获取集合文档中最大值
$push在集合文档中插入值到一个数组中
$pull在集合文档中删除指定的值
$addToSet在集合文档中插入值到一个数组中,如果之前副本中有该元素则不加入
$first根据资源文档的排序获取第一个文档数据
$last根据资源文档的排序获取最后一个文档数据

$push使用示例:

有如下数据:
db.users.insertOne({name:"John",skills:["java","python"]})

使用push操作:
db.users.updateOne({name:"John"},{$push:{skills:"js"}})

执行push后,skills的值为java,python,js

如果skills字段不存在,$push操作符会创建一个新的字段,并将值添加到该字段中。

与$push相对的操作是$pull,pull用于更新或删除数组字段中的特定元素,它会移除所有移除所有符合条件的元素。
假设我们有一个名为student的集合,其中包含一个名为scores的数组字段,每个文档表示一个学生的信息和他们的分数,我们想从scores数组中删除所有分数为80的元素:

db.students.update{

{},
{
    $pull:{
        scores:80
    }
},
{multi:true}

}

第一个参数是一个空的查询条件,这里为空会更新集合中所有文档,第二个参数是要执行的更新操作,这里是移除分数为80的元素,第三个参数{multi:true}表示更新所有匹配的文档。

$push与$addToSet的主要区别是:$push向集合中添加元素时不会去重,也就是集合中有需要push的元素也会添加成功,而addToSet则不会,它有元素重复校验。

聚合框架中常用的几个操作描述:

$project:修改输入文档结构,可以用来重命名、增加或删除域,也可以用于创建计算结果及嵌套文档
$match:用于过滤数据,只输出符合条件的文档
$limit:用来限制返回的文档数
$skip:跳过指定数量的文档,返回余下的文档
$unwid:将文档中某个数据类型字段拆分成多条,每条包含数组中某个值
$group:将集合中的文档分组,用于统计结果
$sort:排序

$unwid示例
有如下文档:
db.invertory.insertOne({"_id":1,"item":"abc",sizes:["S","M","L"]})
使用$unwind为size数组的每个元素输出一个文档:
db.invertory.aggregate([{$unwind:"$sizes"}])
结果:
{"_id":1,"item":"abc",sizes:["S"]}
{"_id":1,"item":"abc",sizes:["M"]}
{"_id":1,"item":"abc",sizes:["L"]}

SQL与aggregate对比

SQLMONGODB
where$match
group by$group
having$match
select$project
order bysort
limit$limit
sum$sum
count$sum
join$lookup

参考文档:聚合aggregate


步履不停
38 声望12 粉丝

好走的都是下坡路