zoukankan      html  css  js  c++  java
  • python | MongoDB聚合操作 (group, aggregate, mapReduce操作二)

     

     
    复制代码
    #MongoDb 聚合方法 group aggrate mapreduce#
    1. Group (不支持分片,分布计算)
        * 语法结构
        <pre>
         db.collection.group({
            key:{category:1}, // 根据category来分类
            cond:{shop_price:{$gt:20}}, // 附加条件商品借个大于20的商品
            reduce:function(curr, result){ // curr 标识一行记录, result自定义变量,
            },
            initial:{total:0}, // 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
            finalize:function(result){ // 最后分组后,得到一个result,再对result进行处理
            }
        });
        </pre>
    
        * 处理max
        <pre>
            db.collection.group({
                key:{category:1}, # 根据category来分类
                cond:{}, # 附加条件商品借个大于20的商品
                reduce:function(curr, result){ # curr 标识一行记录, result自定义变量,
                    if(curr > result.total)
                        $result.total = curr.shop_price;
                },
                initial:{total:0}, # 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
                finalize:function(result){ # 最后分组后,得到一个result,再对result进行处理
                }
            });
        </pre>
        * 处理avg
        <pre>
            db.collection.group({
                    key:{category:1}, # 根据category来分类
                    cond:{shop_price:{$gt:20}}, # 附加条件商品借个大于20的商品
                    reduce:function(curr, result){ # curr 标识一行记录, result自定义变量,
                        result.count += 1;
                        result.total += parseFloat(curr.shop_price);
                    },
                    initial:{total:0,count:0,avg:0}, # 初始化变量,此处定义的变量可以在reduce方法中获取,result.total
                    finalize:function(result){ # 最后分组后,得到一个result,再对result进行处理
                        result.avg = result.total / result.count;
                    }
                });
        </pre>
    2.  aggregate
        * 语法结构
            <pre>
            db.collection.aggregate([
                {},
                {},
                ....,
            ]);
            </pre>
        * $group 类似sql中的select. 根据商品的cat_id、颜色分类, 然后求出分类的商品的库存量
            <pre>
                [
                    {$group:{ _id:{cat_id:"$cat_id", color:"$color"}, total:{$sum:"$goods_number"}}}
                ]
            </pre>
        * $project 类似sql中的select ,取出商品表的cat_id,goods_name,不去出_id字段
            <pre>
            [
                {$project:{_id:0, cat_id:1, goods_name:1}}
            ]
            </pre>
        * $match 匹配条件 取出商品的分类id为3或者价格大于200元的商品
            <pre>
            [
                {$math:{$or:[{cat_id:3}, {price:{$gt:200}}]}}
            ]
            </pre>
        * $unwind 分割字段,(字段必须是数组,否则报错)
            <pre>
            Data Model: shoes
            {_id:1, feature:["man", "big", "black", "cheap"]}
            Command:
            db.shoes.aggregate([
                {$unwind:"$feature"}
            ])
            Output:
            {_id:1,feature:"man"}
            {_id:1,feature:"big"}
            {_id:1,feature:"black"}
            {_id:1,feature:"cheap"}
            </pre>
        * $redact [编辑条件](http://docs.mongodb.org/manual/reference/operator/aggregation/redact/#pipe._S_redact)
        * $limit 限制条件 只取30条记录
            <pre>
            [
                {$limit: 30}
            ]
            </pre>
        * $sort 排序 根据商品库存正序,1/正序 -1/倒序
            <pre>
            [
                {$sort:{goods_number:1,}}
            ]
            </pre>
        * $geoNear [距离计算](http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/#pipe._S_geoNear)
        * $skip 跳过行 跳过20行
            <pre>
            [
                {$skip: 20}
            ]
            </pre>
        * $out 将匹配的结果输出到另外一个集合中, 将价格大于3000的商品取出 cat_id,goods_name,goods_number字段,不去出_id字段,然后按照商品的cat_id,color分类,结果跳过一行,只取30杭记录,把结果push到result集合中
            <pre>
            [
                {$math:{goods_price:{$gte:3000}}},
                {$project:{cat_id:1,goods_name:1, goods_number:1, _id:0}},
                {$group:{_id:{cat_id:"$cat_id", color:"$color"}, total:{$sum:"$goods_number"}}},
                {$skip:1},
                {$limit:30},
                {$out:"result"}
            ]
            </pre>
    
    3. mapReduce方法
        * 语法结构
            <pre>
                db.collection.mapReduce(
                    function(){
                        emit(this.cat_id, this.goods_number);
                    }, // map方法
                    function(key,value){
                        return Array.sum(value);
                    }, // reduce方法
                    {
                        query:{goods_id:{$gt:30}},
                        out:"mapReduceResultSet"
                    }
                );
            </pre>
        * [more information](http://docs.mongodb.org/manual/core/map-reduce/)
  • 相关阅读:
    MHA-Atlas-MySQL高可用(上)
    MySQL数据库企业级应用实践(主从复制)
    MySQL数据库企业级应用实践(多实例源码编译)
    MySQL存储引擎
    MySQL索引与事务
    MySQL数据备份
    MySQL数据库操作
    bzoj 1038: [ZJOI2008]瞭望塔
    bzoj 2451 Uyuw's Concert
    poj 2187 Beauty Contest
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/12175937.html
Copyright © 2011-2022 走看看