MongoDB的聚合操作详解

您所在的位置:网站首页 qq阅读会员充值 MongoDB的聚合操作详解

MongoDB的聚合操作详解

2023-10-19 22:09| 来源: 网络整理| 查看: 265

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

一、聚合操作

聚合操作处理数据记录并返回计算结果。聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类:单一作用聚合、聚合管道、MapReduce。

单一作用聚合:提供了对常见聚合过程的简单访问,操作都从单个集合聚合文档。 聚合管道是一个数据聚合的框架,模型基于数据处理流水线的概念。文档进入多级管道,将 文档转换为聚合结果。 MapReduce操作具有两个阶段:处理每个文档并向每个输入文档发射一个或多个对象的map阶段,以及reduce组合map操作的输出阶段。 1-1、单一作用聚合

MongoDB提供 db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 这类单一作用的聚合函数。 所有这些操作都聚合来自单个集合的文档。虽然这些操作提供了对公共聚合过程的简单访问,但它们缺乏聚合管道和map-Reduce的灵活性和功能。

image.png

db.collection.estimatedDocumentCount()返回集合或视图中所有文档的计数db.collection.count()返回与find()集合或视图的查询匹配的文档计数 。等同于 db.collection.find(query).count()构造db.collection.distinct()在单个集合或视图中查找指定字段的不同值,并在数组中返回结果。 #检索books集合中所有文档的计数 db.books.estimatedDocumentCount() #计算与查询匹配的所有文档 db.books.count({favCount:{$gt:50}}) #返回不同type的数组 db.books.distinct("type") #返回收藏数大于90的文档不同type的数组 db.books.distinct("type",{favCount:{$gt:90}})

注意:在分片群集上,如果存在孤立文档或正在进行块迁移,则db.collection.count()没有查询谓词可能导致计数不准确。要避免这些情况,请在分片群集上使用 db.collection.aggregate()方法。

1-2、聚合管道 1-2-1、什么是 MongoDB 聚合框架

MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:

作用在一个或几个集合上; 对集合中的数据进行的一系列运算; 将这些数据转化为期望的形式;

从效果而言,聚合框架相当于 SQL 查询中的GROUP BY、 LEFT OUTER JOIN 、 AS等。

1-2-2、管道(Pipeline)和阶段(Stage)

整个聚合运算过程称为管道(Pipeline),它是由多个阶段(Stage)组成的, 每个管道:

接受一系列文档(原始数据); 每个阶段对这些文档进行一系列运算; 结果文档输出给下一个阶段;

image.png

聚合管道操作语法

pipeline = [$stage1, $stage2, ...$stageN]; db.collection.aggregate(pipeline, {options}) pipelines 一组数据聚合阶段。除out、out、out、Merge和$geonear阶段之外,每个阶段都可以在管道中出现多次。 options 可选,聚合操作的其他参数。包含:查询计划、是否使用临时文件、 游标、最大操作时间、读写策略、强制索引等等

image.png

1-2-3、常用的管道聚合阶段

聚合管道包含非常丰富的聚合阶段,下面是最常用的聚合阶段

阶段描述SQL等价运算符$match筛选条件WHERE$project投影AS$lookup左外连接LEFT OUTER JOIN$sort排序ORDER BY$group分组GROUP BY$skip/$limit分页$unwind展开数组$graphLookup图搜索$face/ $bucket分面搜索

文档:Aggregation Pipeline Stages — MongoDB Manual

1-2-4、聚合表达式

获取字段信息

$ : 用 $ 指示字段路径 $. : 使用 $ 和 . 来指示内嵌文档的路径

常量表达式

$literal : : 指示常量

系统变量表达式

$$ 使用 $$ 指示系统变量 $$CURRENT 指示管道中当前操作的文档

数据准备 准备数据集,执行脚本

var tags = ["nosql","mongodb","document","developer","popular"]; var types = ["technology","sociality","travel","novel","literature"]; var books=[]; for(var i=0;i= (10*1000*1000)

返回各州平均城市人口

db.zips.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, cityPop: { $sum: "$pop" } } }, { $group: { _id: "$_id.state", avgCityPop: { $avg: "$cityPop" } } } ] ) db.zips.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, cityPop: { $sum: "$pop" } } } ] )

按州返回最大和最小的城市

db.zips.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, { $sort: { pop: 1 } }, { $group: { _id : "$_id.state", biggestCity: { $last: "$_id.city" }, biggestPop: { $last: "$pop" }, smallestCity: { $first: "$_id.city" }, smallestPop: { $first: "$pop" } } }, { $project: { _id: 0, state: "$_id", biggestCity: { name: "$biggestCity", pop: "$biggestPop" }, smallestCity: { name: "$smallestCity", pop: "$smallestPop" } } } ] ) 1-3、MapReduce

MapReduce操作将大量的数据处理工作拆分成多个线程并行处理,然后将结果合并在一起。MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。

MapReduce具有两个阶段:

1. 将具有相同Key的文档数据整合在一起的map阶段

2. 组合map操作的结果进行统计输出的reduce阶段

MapReduce的基本语法

db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: , query: , sort: , limit: , finalize: , scope: , jsMode: , verbose: , bypassDocumentValidation: } ) map,将数据拆分成键值对,交给reduce函数 reduce,根据键将值做统计运算 out,可选,将结果汇入指定表 quey,可选筛选数据的条件,筛选的数据送入map sort,排序完后,送入map limit,限制送入map的文档数 finalize,可选,修改reduce的结果后进行输出 scope,可选,指定map、reduce、finalize的全局变量 jsMode,可选,默认false。在mapreduce过程中是否将数 据转换成bson格式。 verbose,可选,是否在结果中显示时间,默认false bypassDocmentValidation,可选,是否略过数据校验

image.png

统计type为travel的不同作者的book文档收藏数

db.books.mapReduce( function(){emit(this.type,this.favCount)}, function(key,values){return Array.sum(values)}, { query:{type:"travel"}, out: "books_favCount" } )

image.png

从MongoDB 5.0开始,map-reduce操作已被弃用。聚合管道比映射-reduce操作提供更好的性能和可用性。Map-reduce操作可以使用聚合管道操作符重写,例如group、group、group、merge等



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3