Mongodb中数据聚合之聚合管道aggregate

在之前的两篇文章<Mongodb中数据聚合之基本聚合函数count、distinct、group>和<Mongodb中数据聚合之MapReduce>中,我们已经对数据聚合提供了两种实现方式,今天,在这篇文章中,我们讲讲在Mongodb中的另外一种数据聚合实现方式——聚合管道aggregate。

面对着广大用户对数据统计的需求,Mongodb从2.2版本之后便引入了新的功能聚合框架(aggregation framework),它是数据聚合的新框架,这个概念类似于数据处理中的管道。每个文档通过一个由多个节点组成的管道,每个节点都有自己的特殊的作用(分组、过滤等),文档经过由多个节点组成的管道后最终得到输出结果。管道基本的功能有两种:(1)对文档进行过滤,筛选出符合条件的文档;(2)对文档进行变换,改变文档的输出结构。

聚合管道的使用方式:db.collection.aggregate();

对于管道中的多个节点可以使用以下几种管道操作符,下面对各种管道操作符的功能进行描述:

$project:修改文档的结构(重命名、增加或删除域),也可以用于创建计算结果以及嵌套文档。

$match:过滤数据,只输出符合条件的文档。

$limit:限制MongoDB聚合管道返回的文档数。

$skip:在聚合管道中跳过指定数量的文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$group:将集合中的文档分组,可用于统计结果。

$sort:文档排序输出。

$geoNear:输出接近某一地理位置的有序文档。

举两个简单的例子:

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );
db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: user, count: { $sum: 1 } } }
                       ] );

下面对聚合管道使用过程中需要注意的地方进行说明:

(1)管道的是具有先后顺序的。

(2)$group操作目前是在内存中处理的,因此,不能对大量的文档进行使用该种方式进行分组操作;

(3)使用$unwind对数组中的字段值进行拆分时需要注意不能忘记写$符号,如{$unwind:"$tags"},tags字段前面有个$号;

(4)MongoDB 24.对内存做了优化,如果$sort出现在$limit之前,$sort只会对前$limit个文档进行操作,在内存中也只会保留前$limit个文档,节省了内存

(5)$sort操作是在内存中进行的,如果其占有的内存超过物理内存的10%,程序会产生错误

(6)管道的输出结果大小不能大于16M,超过会出现错误。

(7)如果一个管道操作符在执行过程中所占用的内存超过系统内存容量的10%,则会报错;

(8)聚合管道可以提供很好的性能和一致的接口,使用起来比较简单,对于一些简单的固定的聚集操作可以使用管道,但是对于一些复杂的、大量数据集的聚合任务还是使用MapReduce。

至此,关于Mongodb数据库内的数据聚合操作的简单描述便结束了,如果大家想更深入的学习了解,我觉得官网才是最好的教材,

时间: 2024-10-11 06:04:13

Mongodb中数据聚合之聚合管道aggregate的相关文章

Mongodb中数据聚合之基本聚合函数count、distinct、group

在之前的文章<Mongodb中数据聚合之MapReduce>中,我们提到过Mongodb中进行数据聚合操作的一种方式--MapReduce,但是在大多数日常使用过程中,我们并不需要使用MapReduce来进行操作,不然有点杀鸡用牛刀的感觉,在这边文章中,我们就简单说说用自带的聚合函数进行数据聚合操作的实现. Mongodb中自带的基本聚合函数有三种:count.distinct和group.下面我们分别来讲述一下这三个基本聚合函数. (1)count 作用:简单统计集合中符合某种条件的文档数量

MongoDB中聚合工具Aggregate等的介绍与使用

Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直接使用MongoDB原生的命令操作数据库中的数据,并且按照要求进行聚合. MongoDB提供了三种执行聚合的方法:Aggregation Pipleline,map-reduce功能和 Single Purpose Aggregation Operations 其中用来做聚合操作的几个函数是 aggregate(pipeline,options) 指定 group 的

php操作mongodb中的ISODate格式日期

mongodb 中数据记录的日期格式为"dateCreated" : ISODate("2011-12-20T07:22:50.836Z")经过翻阅php官网中的mongodb部分得知,要操作mongodb中的日期须要使用以下关键语句:$start = new MongoDate(strtotime('-1 day'));$end = new MongoDate(time());$resultObject =$db->user->find(array(&

MongoDB中的聚合操作

根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.max.min),就需要通过mapReduce来实现了. 在MongoDB2.2版本以后,引入了新的聚合框架(聚合管道,aggregation pipeline ,使用aggregate命令),是一种基于管道概念的数据聚合操作. Name Description count Counts the num

在MongoDB中实现聚合函数

在MongoDB中实现聚合函数 随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的解决方案,比如NoSQL数据库,它提供了所需的数据存储和处理能力.扩展性和成本效率.NoSQL数据库不使用SQL作为查询语言.这种数据库有多种不同的类型,比如文档结构存储.键值结构存储.图结构.对象数据库等等. 我们在本文中使用的NoSQL是MongoDB,它是一种开

使用aggregate在MongoDB中查找重复的数据记录

我们知道,MongoDB属于文档型数据库,其存储的文档类型都是JSON对象.正是由于这一特性,我们在Node.js中会经常使用MongoDB进行数据的存取.但由于Node.js是异步执行的,这就导致我们无法保证每一次的数据库save操作都是原子型的.也就是说,如果客户端连续两次发起同一事件将数据存入数据库,很可能会导致数据被重复保存.高并发的情况下,哪怕是你在代码中已经做了非常严格的校验,例如插入数据前判断要保存的数据是否已经存在,但仍然有可能会出现数据被重复保存的风险.因为在异步执行中,你没有

mongoDB查询、索引与聚合

整理来自 https://www.shiyanlou.com/courses/running/77 初始化mongodb数据库 > use Chenshi switched to db Chenshi > db.createCollection("shiyanlou") #无参数 {"ok":1} > show collections shiyanlou system.indexes > userdoc1=({"user_id&qu

MongoDB查询、索引和聚合

初始化mongodb数据库 > use deng switched to db deng > db.createCollection("jingdong") #无參数 {"ok":1} > show collections jingdong system.indexes > userdoc1=({"user_id":1,"name":"cloud","state"

MongoDB(4): 聚合框架

一.简介 MongoDB的聚合框架,主要用来对集合中的文档进行变换和组合,从而对数据进行分析以加以利用. 聚合框架的基本思路是: 采用多个构件来创建一个管道,用于对一连串的文档进行处理. 这些构件包括: 筛选(filtering).投影(projecting).分组(grouping).排序(sorting).限制(limiting)和跳过(skipping). 使用聚合框架的方式: db.集合.aggregate(构件1,构件2-) 注意:由于聚合的结果要返回到客户端,因此聚合结果必须限制在1