Mongodb聚合框架Aggregate
一 概念
1、简介
mongo aggregation是mongo的一个轻量级的map-reduce框架,可以实现一些count,sum,group by的聚合。
使用聚合框架可以对集合中的文档进行变换和组合。可以用多个构件创建一个管道,用于对一连串的文档进行处理。构件有:筛选、投射、分组、排序、限制和跳过。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理,管道操纵是可以重复的。
2、管道表达式
管道操作符作为“键”,所对应的“值”叫做管道表达式。例如{$match:{status:”A”}},$match称为管道操作符,而{status:”A”}称为管道表达式,它可以看作是管道操作符的操作数(Operand),每个管道表达式是一个文档结构,它是由字段名、字段值、和一些表达式操作符组成的,例如管道表达式$group: { _id: null, count: { $sum: 1 } } 就包含了一个表达式操作符$sum进行累加求和。
每个管道表达式只能作用于处理当前正在处理的文档,而不能进行跨文档的操作。管道表达式对文档的处理都是在内存中进行的。除了能够进行累加计算的管道表达式外,其他的表达式都是无状态的,也就是不会保留上下文的信息。累加性质的表达式操作符通常和$group操作符一起使用,来统计该组内最大值、最小值等。
3、aggregate语法
db.collection.aggregate(pipeline, options)
pipeline:管道操作数组,也可以为文档类型,如果该参数不是数组形式,无法指定options参数
options:aggregate命令的附加选项,文档类型。
1) explain:布尔值,指定返回结果是否显示该操作的执行计划
2) allowDiskUse:
布尔值,指定该聚合操作是否使用磁盘。每个阶段管道限制为100MB的内存。如果一个节点管道超过这个极限,MongoDB将产生一个错误。为了能够在处理大型数据集,可以设置allowDiskUse为true来在聚合管道节点把数据写入临时文件。这样就可以解决100MB的内存的限制。
3) cursor:
4) maxTimeMS:
5) bypassDocumentValidation:
6) readConcern:
7) collation:
4、分片使用
db.collection.aggregate()可以作用在分片集合,但结果不能输在分片集合,MapReduce可以 作用在分片集合,结果也可以输在分片集合。
5、聚合中的游标
db.collection.aggregate()方法可以返回一个指针(cursor),数据放在内存中,直接操作。跟Mongo shell 一样指针操作。
二 管道操作符
1、$match:用于对文档集合进行筛选,在$match中不能使用$geoNear地理空间操作符及$where表达式操作符。
示例: 获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
2、$project:可以从子文档中提取字段,可以重命名字段,可以移除字段。
示例: 获取article集合的title字段及author字段,将字段_id屏蔽
db.article.aggregate({
$project : {
_id : 0 ,
title : 1 ,
author : 1
}});
3、$group:操作可以根据文档特定字段的不同值进行分组,$group不能用流式工作方式对文档进行处理。 在$group阶段,内存的大小最大可以为100Mb,如果超过则会出错。当处理大量数据是,可以将参数allowDiskUse置为true,如此$group操作符可以写入临时文件,格式:
{ $group: { _id: <expression>,<field1>: { <accumulator1> : <expression1> }, … } }
_id字段是强制性的,可以指定其为空来进行其他累加操作,accumulator操作符可以为:$sum、$avg、$first、$last、$max、$min、$push、$addToSet、$stdDevPop、$stdDevSamp
注:$group的输出是无序的,且该操作目前是在内存中进行的,所以不能用它来对大量个数的文档进行分组。
4、$unwind:分割数组嵌入到自己顶层文件,会将数组中的每一个值拆分为单独的文档,这样一个文档会被分为数组长度个文档。
示例:将博客评论映射为cts并查找评论作者为Mark的文档
> db.blog.aggregate([
{"project":{"cts":"$comments"}},
{"$unwind":"$cts"},
{"$match":{"cts.author":"Mark"}
]);
注:{$unwind:”$cts”})不能忘了$符号,且如果$unwind目标字段不存在的话,那么该文档将被忽略过滤掉。
5、$limit:$limit会接受一个数字n,返回结果集中的前n个文档。
{ $limit: <positive integer> }
示例:查询5条文档记录
db.article.aggregate(
{ $limit : 5 }
);
6、$skip:$skip接受一个数字n,丢弃结果集中的前n个文档
{$skip: <positive integer> }
示例:获取article集合中第5条数据之后的数据
db.article.aggregate(
{ $skip : 5 }
);
7、$sort:可以根据任何字段进行排序,”$sort”不能用流式工作方式对文档进行处理,必须要接收到所有文档之后才能进行排序。当排序的字段BSON类型不一致时,按一下顺序进行排序
官方参考文档:
The MongoDB 3.2 Manual:
https://docs.mongodb.com/v3.2/
Spring Data MongoDB - Reference Documentation
https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/
Mongodb聚合框架Aggregate相关推荐
- mongodb 聚合框架_如何使用MongoDB的聚合框架处理高级数据处理
mongodb 聚合框架 MongoDB has come a long way. Even though there are many NoSQL databases out there, Mong ...
- python 连接数据库导数_python – 使用MongoDB聚合框架计算一阶导数
我们可以使用MongoDB 3.2或更高版本中的聚合框架来实现,因为我们真正需要的是一种跟踪数组中当前和上一个元素的索引的方法,幸运的是从MongoDB 3.2开始,我们可以使用 $unwind运算符 ...
- Mongo 聚合框架-Aggregate(一)
一 概念 1.简介 使用聚合框架可以对集合中的文档进行变换和组合.可以用多个构件创建一个管道,用于对一连串的文档进行处理.构件有:筛选.投射.分组.排序.限制和跳过. MongoDB的聚合管道将Mon ...
- mongodb聚合查询-aggregate
Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...
- MongoDB聚合(aggregate)常用操作及示例
简介 MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果. 有点类似 SQL 语句中的 count(*). 常用操作 表达式 描述 $mat ...
- MongoDB Aggregation 聚合框架
MongoDB Aggregation 聚合框架 文章目录 MongoDB Aggregation 聚合框架 前言 1.MongoDB 聚合框架是什么 2.管道(Pipeline)和步骤(Stage) ...
- MongoDB 聚合
聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- MongoDB聚合查询
MongoDB高手课_MongoDB_NoSQL-极客时间极客时间推出的MongoDB高手课是帮助互联网从业者学习MongoDB.NoSQL的在线课程,极客时间是面向IT领域的知识服务产品,致力于帮助 ...
最新文章
- 微软总裁:比尔盖茨人生简介和名言
- 忽略证书_中专考生注意!忽略这一点,四科全过也拿不到执业药师证书!
- 智能家居系统c语言源代码,智能家居软件设计(附源程序).doc
- 宿舍管理系统(简单版)
- pcm转mp3保姆级教程附源码
- 编译原理学习笔记 6.4 分程序结构语言的符号表组织
- ssh: connect to host master port 22: No route to host
- vivos9e防抖功能设置教程
- 计算机多媒体培训总结,教师多媒体培训心得体会3篇
- 电视剧《奋斗》精彩对白节选---(三)
- 载入pytorch的预训练模型时遇到_pickle.UnpicklingError: unpickling stack underflow
- 数据预测算法-指数平滑法-2
- PNETlab最新版介绍与下载
- TFLite Objec Detection IOS 检测核心代码说明
- js中的contains
- 交换机中的冗余链路管理
- [scRNA-seq]单细胞转录因子分析——SCENIC算法简析
- Docker使用docker compose搭建Jellyfin私人媒体服务器 个人电影网站
- 龙迅LT7211方案|CS5211替代LT7211设计DP to 2-port LVDS转接板方案原理图+PCB板
- PMT函数(5个参数)使用java代码实现