我是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);
}
我有两个问题:
当我在开发模式中运行时,一切正常,我得到了以下结果(跳过一些行来结果化):
{"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的更好方法,因为在数百万用户中,随着用户值变得非常大,这将变得非常紧张。正确?
谢谢
答案 0 :(得分:0)
日志文件mapreduce_errors说什么? (您可以在/ opt / couchbase / var / lib / couchbase / logs中找到该文件)
我猜你会看到'reduction_too_long'的消息。看看以下问题,也许他们会有所帮助:
或此处:http://www.couchbase.com/forums/thread/newbie-question
如果您从日志中包含更多信息,我将能够更好地提供帮助:)
答案 1 :(得分:0)
以下内容并没有很好地减少但是它对我来说有大约300万条记录,并且会根据只有一个发射的时间段为你提供聚合,其中
group_level = 1表示年份
group_level = 2表示按月
group_level = 3表示日期等。
<强>地图
function (doc, meta) {
// date of document
var date = new Date(doc.time);
// Granularity
var day = date.getDate();
var month = date.getMonth()+1;
var year = date.getFullYear();
var hour = date.getHours();
var min = date.getMinutes();
var obj ={};
obj[doc.uid] = 1;
}
<强>减少强>
function (key, values, rereduce) {
var userids = {};
function collate(values) {
for (userid in values) {
if (userids[userid])
userids[userid] +=values[userid]
else
userids[userid] =values[userid]
}
}
values.forEach(function(partial) {
collate(partial)
});
return userids;
}
不幸的是,进一步减少超出了我的灰色单元格,如果你返回数组而不是对象,你仍然可以减少你的内存使用量,如果你明智地使用group_level它可能会运行良好。