mongodb(4)--聚合操作
一、简单介绍
聚合操作处理数据记录并返回计算结果。
聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。
- 单一作用聚合:提供对常见聚合过程的简单访问,操作都从单个集合聚合文档。
- 聚合管道操作:将文档在一个管道处理完毕后,把处理的结果传递给下一个管道进行再次处理
- MapReduce操作:是将集合中的批量文档进行分解处理,然后将处理后的各个结果进行合并输出
二、单一作用聚合
1、说明:
MongoDB提供的单一作用的聚合函数。
所有这些操作都聚合来自单个集合的文档。
虽然这些操作提供了对公共聚合过程的简单访问,但它们缺乏聚合管道和map-Reduce的灵活性和功能。
2、语法:
-- 返回集合或视图中所有文档的计数 db.collection.estimatedDocumentCount() -- 返回与find()集合或视图的查询匹配的文档计数 db.collection.count() -- 在单个集合或视图中查找指定字段的不同值,并在数组中返回结果 db.collection.distinct()
3、举例说明:
db.Books.estimatedDocumentCount() -- 计数 db.Books.count({price:{$gt:50}}) db.Books.distinct("item",{price:{$gt:50}}) -- 查找name字段的不同值 db.Books.distinct("name")
三、聚合管道操作
1、语法结构:
piplines = [$stage1,$stage2,...] db.COLLECTION_NAME.aggregate([pipelines],{options})
参数说明:
- pipelines:每一个stage都是一个管道操作,一组数据聚合阶段。除$out、$Merge和$geonear阶段之外,每个阶段都可以在管道中出现多次。
- 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操作
1、说明:
MongoDB提供Map-Reduce操作来进行聚合操作。通常,Map-Reduce操作有两个阶段,即Map和Reduce阶段。
- Map阶段是对集合中的每个输入文档进行处理,处理结束后输出一个或多个结果
- Reduce阶段是将Map阶段输出的一个或多个结果进行合并输出
2、MapReduce具有两个阶段:
- Map:映射。将具有相同Key的文档数据整合在一起的阶段。
- Reduce:归约。组合map操作的结果进行统计输出的阶段。
3、语法结构
db.COLLECTION_NAME.mapReduce( function(){emit(key,value);}, -- map函数,第三步 function(key,values){return reduceFunction},-- reduce函数,第四步 { query:条件,-- 第一步 out:New_COLLECTION_NAME,-- 第二步 sort:条件, limit:number } )
4、参数说明:
- mapReduce():用于对当前集合进行聚合操作的函数。
- map映射函数:map函数调用emit(key,value)方法, 遍历集合中的所有文档,返回key-value键值对,并将key和value输入到reduce函数中。
- reduce统计函数:reduce函数主要 是将key-values变成key-value,即将values数组变成单一的值value。
- 参数query:主要用于筛选文档,满足条件的文档才会调用map函数。
- 参数out:用于存放聚合统计后的结果。
- 参数sort:一般结合limit参数进行使用,在满足条件的文档输入map函数之前进行排序操作。
- 参数limit:用于限定输入map函数的文档数量。
5、举例说明:
db.comment.mapReduce( function(){emit(this.nickname,1);}, function(key,values){return Array.sum(values)}, { query:{state:"1"}, out:"comment_total" } ) db.comment_total.find()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix