• 【MongoDB】聚合


    聚合(Aggregation)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。MongoDB提供了3中方式来执行聚合命令:

    • 聚合管道方法
    • map-reduce方法
    • 单一目标聚合方法

    1.聚合管道方法

    语法格式:

    db.collection_name.agreegate(
        [
            {
                $match:{<field>} // 统计查找条件
            },
            {
                $group:{<field1>,<field2>} // field1指定分类字段,field2为各种统计操作符,如:$sum、$avg、$min、$max、$push、$addToSet、$first、$last
            }
        ]
    )
    
    // 插入测试数据
    db.custInfo.insert(
    	[
            {custId:"A001",custName:"马岱",deptNo:"D01",sal:20000,addr:"云南"},
            {custId:"A002",custName:"关羽",deptNo:"D01",sal:50000,addr:"云南"},
            {custId:"A003",custName:"曹真",deptNo:"D02",sal:10000,addr:"云南"},
            {custId:"A004",custName:"司马懿",deptNo:"D02",sal:30000,addr:"山东"}
        ]
    )
    // 查询出addr为云南的记录,并按deptNo分组统计sal
    db.custInfo.aggregate(
        [
            {
                $match:{addr:"云南"} // 查找条件
            },
            {
                $group:{
                    _id:"$deptNo",total:{$sum:"$sal"}
                }
            }
        ]
    )
    

    说明:_id:"$deptNo",deptNo为分类字段,_id为必须指定唯一性字段,不能修改;total为统计结果字段,可以修改为任意新名称。

    2.map-reduce方法

    语法格式:

    db.collection_name.mapreduce(
        function() {emit(<this.field1>,<this.field2>)}, // 对字段field1、field2进行map(映射操作)
        function(key,values) {return Array.sum(values)}, // 对map过来的field1、field2进行reduce(归约)操作,求sum
        {query:{<field>},out:<"result_name">} // query定义查询条件,out定义返回结果的变量名
    )
    

    该方式进行聚合操作,效率较聚合管道方式要低,而且使用更复杂。

    var mr=db.custInfo.mapReduce(
    	function(){
            emit(this.deptNo, this.sal); // map自定义函数
        },
        function(key, values){
            return Array.sum(values)// Reduce自定义函数
        },
        {
            query:{addr:"云南"},
            out:"Total"
        }
    )
    //------------------分割线-------------------------------------------
    // 输出计算结果
    db.Total.find()
    

    3.单一目标聚合方法

    语法格式:db.collection_name.count(query,options)
    说明:统计集合中里符合条件的文档数量,query为查询条件,option参数可以为:limit,skip,hint等
    示例:

    // 统计custInfo集合的总记录数
    db.custInfo.count()
    // 统计addr为云南的记录数
    db.custInfo.count({addr:"云南"},{skip:1})
    

    单一目标聚合方法,可以直接在find后使用:db.custInfo.find({custName:"曹真"}).count()

  • 相关阅读:
    case class inheritance
    [Akka]发送一条消息的内部流程
    Java 8 新特性
    大数据学习笔记
    磁盘结构
    AtomicReference 和 volatile 的区别
    How to support both ipv4 and ipv6 address for JAVA code.
    使用JProfiler分析定位java内存泄露memory leak
    redhat mount iso as one yum repository
    Linux Shell常用技巧
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12318996.html
Copyright © 2020-2023  润新知