数据格式如下:
{
-------------------------------------------------
需求:统计出每个用户每周的登陆次数
-------------------------------------------------
function Map() {
聚合出来的数据
{
"_id" : "0_fairy|2013|0",
"value" : {
"username" : "0_fairy",
"year" : 2013.0,
"week" : 0.0,
"count" : 1.0,
"startDate" : new Date("31/12/2012 00:00:00"),
"endDate" : new Date("6/1/2013 23:23:59")
}
}
------------------------------------------------------------
{
}
有数据则说明此用户是活跃用户。
{
"_id" : 9040001,}
"username" : "shao1",
"cityId" : 320200,
"versionVal" : NumberLong("210000200000"),
"loginInIP" : "192.168.2.7",
"logoutTime" : new Date("1/9/2014 21:01:00"),
"hardwareCodes" : "76332f9bafe7aff580e47e42df07e5c7",
"addTime" : new Date("1/9/2014 20:01:00"),
"isLegalCopy" : 1,
"enterpriseId" : 0,
"loginTime" : new Date("1/9/2014 20:01:00"),
"logId" : "078EF19407AC4798882A7587B358B517",
"logType" : 1,
"loginOutIP" : "192.168.2.7",
"version" : "25.1.0",
"userIdentityIds" : -1,
"provinceId" : 320000,
"productId" : 3
-------------------------------------------------
需求:统计出每个用户每周的登陆次数
-------------------------------------------------
function Map() {
//获取时间所在年份的周数
var getWeekNumOfYear = function(date) {
var year = date.getFullYear();var month = date.getMonth() + 1;var day = date.getDate();beginDay = new Date(year, 0, 1);var weekDay = beginDay.getDay();
if (weekDay == 6) {
beginDay = new Date(year, 0, 7);
} else {
beginDay = new Date(year, 0, 6 - weekDay);
}
today = new Date(year, parseInt(month) - 1, day);var weekNum = Math.ceil(((today - beginDay) / 86400000) / 7);if (today.getDay() == 6 ) {
weekNum = weekNum - 1;
}if (today.getDay() == 0) {
weekNum = weekNum - 1;
}return weekNum;
};
//获取时间所在周数的开始时间
var getWeekStartDate =function (date) {
var year = date.getFullYear();var month = date.getMonth() + 1;var day = date.getDate();var weekDay;today = new Date();today.setFullYear(year, month - 1, day);weekDay = today.getDay();if(weekDay ==0 ){
weekDay = 7;
}if (weekDay == 1) {
today.setDate(today.getDate());
} else{
today.setDate(today.getDate() - weekDay + 1);
}return new Date(today.getFullYear() + "/" + (today.getMonth() + 1) + "/" + today.getDate() +" 00:00:00");
};
//获取时间所在周数的结束时间
var getWeekEndDate = function (date) {
var year = date.getFullYear();var month = date.getMonth() + 1;var day = date.getDate();var weekDay;today = new Date();today.setFullYear(year, month - 1, day);weekDay = today.getDay();if (weekDay == 0) {
today.setDate(today.getDate());
} else {
today.setDate(today.getDate() - weekDay + 7);
}
return new Date(today.getFullYear() + "/" + (today.getMonth() + 1) + "/" + today.getDate() +" 23:23:59");
};
//获取时间的年份
var year = function(date){return date.getFullYear();};
var week = getWeekNumOfYear(this.loginTime);
//用户名+年份+周数组成唯一标识
var key = this.username +"|"+ year(this.loginTime) +"|"+ week;
emit(
key,{"un":this.username,"year":year(this.loginTime),
"week":week,"count":1,"st":getWeekStartDate(this.loginTime),"et":getWeekEndDate(this.loginTime)}
);}
function Reduce(key, values) {
var reduce = {"un":"","year":0,"week":0,"count":0,"st":new Date(),"et":new Date()};
for(var i in values){
reduce.un = values[i].un;reduce.year = values[i].year;reduce.week = values[i].week;reduce.st = values[i].st;reduce.et = values[i].et;//相同的数据累加登陆次数if((reduce.un == values[i].un)&& (reduce.year == values[i].year)&& (reduce.week == values[i].week)){
reduce.count = values[i].count + reduce.count;
}
}}
return reduce;
----------------------------------------------------------
聚合出来的数据
{
"_id" : "0_fairy|2013|0",
"value" : {
"username" : "0_fairy",
"year" : 2013.0,
"week" : 0.0,
"count" : 1.0,
"startDate" : new Date("31/12/2012 00:00:00"),
"endDate" : new Date("6/1/2013 23:23:59")
}
}
------------------------------------------------------------
查询:
{
"value.username":"0_fairy",
"value.startDate":{$gte:new Date("2012-12-31 00:00:00")},
"value.endDate":{$lte:new Date("2014-8-31 23:23:59")}
"value.count":{$gte:1}
}
有数据则说明此用户是活跃用户。