我有存储对特定页面的访问的文档,基本上看起来像这样(实际上有更多的数据点,但这应该明白这一点):
[
{
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
}
}
}