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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值