尝试从MongoDB获取总数和百分比(使用MapReduce)

尝试从MongoDB获取总数和百分比(使用MapReduce),mongodb,mapreduce,mongodb-query,Mongodb,Mapreduce,Mongodb Query,我有一些文档存储对特定页面的访问,基本上看起来是这样的事实上有更多的数据点,但这应该能让人明白这一点: [ { page: "home", timeStamp: 1417457320 }, { page: "service", timeStamp: 1417457323 }, { page: "service", timeStamp: 1417457325 } ] 我试图报告两件事:每个页面每天的总页面浏览量,以及每个页面占每天总页面

我有一些文档存储对特定页面的访问,基本上看起来是这样的事实上有更多的数据点,但这应该能让人明白这一点:

[
  {
   page: "home",
   timeStamp: 1417457320
  },
  {
   page: "service",
   timeStamp: 1417457323
  },
  {
   page: "service",
   timeStamp: 1417457325
  }
]
我试图报告两件事:每个页面每天的总页面浏览量,以及每个页面占每天总页面浏览量的百分比。我要找的东西是:

{
  date: 1417392000000,
  page: "home",
  visits: 123,
  percentageOfTotalVisits: .3
}
这篇文章让我很快得到了总数,但我一直在努力得到总数的百分比

谢谢

由于您的结果是基于每天的,因此您需要按日期对记录进行分组。然后进行计算。map reduce函数可以编写如下:

地图功能:

将年、月和日期的组合作为键发出。 作为页面名称的值。 日期、年份和日期信息在发出之前从时间戳中提取

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函数:

跟踪特定密钥的唯一页面数。 收集每页的计数后,将计算百分比。 每个键返回结果

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;
}
示例o/p:在db.out.find.pretty上

db.collection.mapReduce(map,reduce,{out: "out"})    
{
        "_id" : "17070",
        "value" : {
                "home" : {
                        "visits" : 1,
                        "percentageOfTotalVisits" : 0.3333333333333333
                },
                "service" : {
                        "visits" : 2,
                        "percentageOfTotalVisits" : 0.6666666666666666
                }
        }
}