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



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

[
  {
   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/)让我很快就得到了总数,但我被困在试图获得总数的百分比。

谢谢!

由于您的结果是基于per day,因此您需要按date group记录。然后执行计算。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});
}

归约函数:

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

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;
}

在集合上调用映射缩减。

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
                }
        }
}

相关内容

  • 没有找到相关文章

最新更新