Fork me on GitHub

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/)
posted @ 2020-01-10 14:20  MR_黄Python之路  阅读(1712)  评论(0编辑  收藏  举报