之前在《MongoDB基础之聚合查询示例》提供了一组分类和文章的测试数据,以下就在之前的这一组数据基础上做计算模型操作。

5.1 按 category_id 分组统计条数

db.post.mapReduce(
    function(){
        emit(this.category_id,1)
    },
    function(key,values){
        var cnt = 0;
        values.forEach(function(value){
            cnt += value
        })
        return cnt;
    },
    {
        out:'cnt'
    }
).find();

5.2 按 category_id 和 author 两个字段分组统计

db.post.mapReduce(
    function(){
        emit({author:this.author, category_id:this.category_id},1)
    },
    function(key,values){
        var cnt = 0;
        values.forEach(function(value){
            cnt += value;
        })
        return cnt;
    },
    {
        out:'cnt'
    }
).find();

5.3 按 category_id 分组后,统计条数和点击总数

db.post.mapReduce(
    function(){
        emit(this.category_id,{count:1,hits:this.hits})
    },
    function(key,values){
        var cnt = 0;
        var sum = 0;
        values.forEach(function(value){
            cnt += value.count;
            sum += value.hits
        })
        return {
            count: cnt,
            hits: sum
        }
    },
    {
        out:'summary'
    }
).find()

5.4 按 category_id 分组后,统计条数和点击总数量,最后在求平均点击数

db.post.mapReduce(
    function(){
        emit(this.category_id,{count:1,hits:this.hits})
    },
    function(key,values){
        var cnt = 0;
        var sum = 0;
        values.forEach(function(value){
            cnt += value.count;
            sum += value.hits
        })
        return {
            count : cnt,
            hits : sum
        }
    },
    {
        out:'summary',
        finalize: function(key,reduceResult){
            reduceResult.avg = (reduceResult.sum/reduceResult.cnt).toFixed(2)
            return reduceResult
        }
    }
).find()

参考文档:https://www.cnblogs.com/Joe-T/p/4264910.html

本文为 陈华 原创,欢迎转载,但请注明出处:http://www.ichenhua.cn/blog/post/42