【发布时间】:2013-12-24 14:18:22
【问题描述】:
我是 CouchBase 和 Map/reduce 逻辑的新手。我要创建的是一个视图,我可以在其中查看每天/每月/每年/每小时和每天/每月/每年的唯一用户
例如,假设我们插入了以下 JSON 文档:
{
uid:"user1",
time: "2013/12/24 18:45"
city:"London"
event:"open"
},
{
uid:"user1",
time: "2013/12/24 18:46"
city:"London"
event:"open"
},
{
uid:"user2",
time: "2013/12/24 18:46"
city:"London"
event:"open"
}
所以我想要的结果是:
{time:"2013-12-24 18:45", count:1}
{time:"2013-12-24 18:46", count:2}
{time:"2013-12-24 18", count:2} // user1 is considered as uniqu within the hour and counted once
我尝试了以下方法:
地图
function (doc, meta) {
// date of document
var date = new Date(doc.time);
// Granularity
var day = date.getDate();
var month = date.getMonth();
var year = date.getFullYear();
var hour = date.getHours();
var min = date.getMinutes();
emit([year, month, day, hour, min], {user: doc.uid, count:1});
emit([year, month, day, hour], {user:doc.uid, count:1});
}
减少
function(key, values, rereduce){
if(rereduce) return;
var users = {user: "", count: 0 };
values.forEach(function(v) {
for(var k in v) {
if(!users[k])
users[k] = 0
users[k] += v[k];
}
});
return(users);
}
我有两个问题:
当我在 development 模式下运行时,一切正常,我得到以下结果(跳过一些行来美化结果):
{"rows":[
{"key":[2013,11,19,18],"value":{"user":"00user9...skipped...","count":229}},
{"key":[2013,11,19,18,24],"value":{"user":"00user244user9...skipped...","count":228}},
{"key":[2013,11,19,18,25],"value":{"user":"0user804","count":1}}
]
}
但如果我在 full_set 中运行它,我会返回一个错误:
from:
http://127.0.0.1:8092/thomas/_design/dev_uusers/_view/uunsers_per_day? full_set=true&group=true&stale=false&connection_timeout=60000&limit=10&skip=0
reason:
error (function_clause)
第二个是有更好的方法来不返回用户 ID,因为在数百万用户中,这将变得非常内存密集,因为 user 值会变得非常大,对吧?
谢谢
【问题讨论】:
标签: count mapreduce unique couchbase