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>:-11} } ] )
-- $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()

 

 

posted @   洛小依ovo  阅读(772)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示