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对比
SQL | MONGODB |
---|---|
where | $match |
group by | $group |
having | $match |
select | $project |
order by | sort |
limit | $limit |
sum | $sum |
count | $sum |
join | $lookup |
参考文档:聚合aggregate
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。