一、简单介绍
mongodb的聚合操作分为管道操作和MapReduce操作等。
- 聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理
- MapReduce操作:是将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出
二、聚合管道操作
1、语法结构:
piplines = [pipe1,pipe2,...]
db.COLLECTION_NAME.aggregate([pipelines],options)
参数说明:
- pipelines:每一个pip都是一个管道操作
- options:可选项
2、常见的管道操作符
| 常见管道操作符 | 说明 |
| $group | 将集合中的文档进行分组,便于后续统计结果 |
| $limit | 用于限制MongoDB聚合管道返回的文档数 |
| $match | 用于过滤数据,只输出符合条件的文档 |
| $sort | 将输入的文档先进行排序,再输出 |
| $project |
用于修改输入文档的结构(增加、删除字段等)和名称,控制字段显示规则,0不显示/1显示 |
| $skip |
在聚合管道中跳过指定数量的文档,并返回剩余文档 |
3、语法结构
-- $group 操作符
db.COLLECTION_NAME.aggregate( [ { $group:{<key1>:"$<key2>"} } ] )
-- <key1>:别名;<key2>:以key2字段分组group
-- slimit 操作符
db.COLLECTION_NAME.aggregate( { $limit:整型数字 } )
-- Smatch 操作符
db.COLLECTION NAME.aggregate( [ { $match:{<key>:<value>} } ] )
-- <key> 字段名;<value> 字段值
-- $sort 操作符,-1表示降序,1 表示升序
db.COLLECTION NAME.aggregate( [ { $sort:{<key>:-1或1} } ] )
-- $project 操作符
db.COLLECTION NAMB.aggregate( [ { $project:{<key>:<value>} ] } ] )
-- $skip操作符
db.COLLECTION_NAME.aggregate( { $skip:整型数字 } )
4、举例说明
db.comment.aggregate([{$group:{_id:"$userid"}}])
db.comment.aggregate({$limit:3})
db.comment.aggregate([{$match:{nickname:"罗密欧"}}])
db.comment.aggregate([{$sort:{age:-1}}])
db.comment.aggregate([{$project:{_id:0}}])
db.comment.aggregate({$skip:4})
5、管道表达式
管道阶段操作器的值被称为管道表达式,并且每个管道表达式都是一个文档结构,由字段名称、字段值、和管道表达式组成
1)常见的管道表达式
| 常见管道表达式 | 说明 |
| $sum | 计算总和 |
| $avg | 计算平均值 |
| $min | 获取集合中所有文档对应值的最小值 |
| $max | 获取集合中所有文档对应值的最大值 |
| $push | 在结果文档中插入值到一个数组中 |
| $first | 获取分组文档中的第一个文档 |
| $last | 获取分组文档中的最后一个文档 |
2)语法结构
-- sum表达式
db.COLLECTION_NAME.aggregate([{
管道操作符: {
< key1 > : "$<key2>",
< key3 > : {
$sum: $ < key4 >
}
}
}])
-- key1 管道操作字段完结果的别名
-- key2 字段名
-- key3 管道表达式结果的别名
-- key4 进行管道表达式操作的字段
3)举例说明
-- 数据
db.product.insertMany([
{_id:"1",name:"iPhone 8",price:3000,type:"电子通讯"},
{_id:"2",name:"adidas neo",price:700,type:"服装"},
{_id:"3",name:"nike air max 90",price:760,type:"服装"},
{_id:"4",name:"HuaWei mate30",price:5000,type:"电子通讯"},
{_id:"5",name:"vivo x27",price:2000,type:"电子通讯"},
])
-- 以type字段分组,将pice字段求和输出
db.product.aggregate([{
$group: {
"_id": "$type",
"price": {
$sum: "$price"
}
}
}])
-- 以price字段过滤大于700的数值,然后传到下一个管道,
-- 以type字段分组,把找到的第一个文档的name字段显示,用product别名表示
db.product.aggregate([{
$match: {
price: {
$gt: 700
}
}
}, {
$group: {
_id: "$type",
product: {
$first: "$name"
}
}
}])
三、MapReduce操作
---
---