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/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM