【问题标题】:Trying to get totals AND percentages from MongoDB (using MapReduce)尝试从 MongoDB 获取总数和百分比(使用 MapReduce)
【发布时间】:2014-12-01 20:37:33
【问题描述】:

我有存储对特定页面的访问的文档,基本上看起来像这样(实际上有更多的数据点,但这应该能说明问题):

[
  {
   page: "home",
   timeStamp: 1417457320
  },
  {
   page: "service",
   timeStamp: 1417457323
  },
  {
   page: "service",
   timeStamp: 1417457325
  }
]

我试图报告两件事:每个页面每天的总页面浏览量,以及每个页面占每天总页面浏览量的百分比。我正在寻找类似的东西:

{
  date: 1417392000000,
  page: "home",
  visits: 123,
  percentageOfTotalVisits: .3
}

这篇文章 (http://cookbook.mongodb.org/patterns/unique_items_map_reduce/) 让我很快得到了总数,但我一直在试图获得总数的百分比。

谢谢!

【问题讨论】:

    标签: mongodb mapreduce mongodb-query


    【解决方案1】:

    由于您的结果基于per day,您需要groupdate 的记录。然后进行计算。 map-reduce 函数可以写成如下:

    map 函数:

    • 发出年、月、日的组合作为键。
    • 该值为页面名称。

    日期、年份和日期信息是在发出之前从时间戳中提取的。

    var map = function(){
    var date = new Date(this.timeStamp);
    var year = date.getYear();
    var day = date.getDate();
    var month = date.getMonth();
    var key = day+""+month+""+year;
    emit(key,{"page":this.page});
    }
    

    reduce 函数:

    • 跟踪特定键的唯一页面数。
    • 收集每页计数后,将计算百分比。

    每个键都返回result

    var reduce = function(id,obj){
        var result = {};
        var totalCount = 0;
        for(var i=0;i<obj.length;i++)
        {
            if(result[obj[i].page]){
                result[obj[i].page].visits++; 
            }
            else{
                result[obj[i].page] = {"visits":1,"percentageOfTotalVisits":0};
            }
            totalCount++;
        }
        var keys = Object.keys(result);
        for(var j=0;j<keys.length;j++)
        {
            result[keys[j]].percentageOfTotalVisits = 
                                 result[keys[j]].visits/totalCount;
        }
        return result;
    }
    

    在集合上调用 map reduce。

    db.collection.mapReduce(map,reduce,{out: "out"})    
    

    示例 o/p:在 db.out.find().pretty()

    {
            "_id" : "17070",
            "value" : {
                    "home" : {
                            "visits" : 1,
                            "percentageOfTotalVisits" : 0.3333333333333333
                    },
                    "service" : {
                            "visits" : 2,
                            "percentageOfTotalVisits" : 0.6666666666666666
                    }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多