我会使用如下地图函数:
function (doc) {
emit(doc.date, doc.user);
}
它将发出按日期排序的文档,其中用户是值。 reduce 函数如下所示:
function(keys, values, rereduce) {
if (rereduce) {
return values.reduce(function (acc, index) {
return Object.keys(index).reduce(function (acc, user) {
acc[user] = (acc[user] || 0) + index[user];
return acc;
}, acc);
}, {});
} else {
return values.reduce(function (acc, user) {
if (!(user in acc)) acc[user] = 0;
acc[user]++;
return acc;
}, {});
}
}
这是一个自定义的 reduce 函数,所以请耐心等待我的简要说明。正常情况(第二个分支,而不是rereduce)基本上计算了它找到的值。结果是像{ some_user_id: 1 } 这样的对象。
rereduce 分支基本上采用几个缩减的对象并将它们(及其计数)合并为 1 个缩减的结果。 (你可以阅读更多关于reduce和rereduce的信息here)
从那里,您可以使用以下查询参数查询您的视图:
start_key="2015-09-15"
end_key="2015-09-25"
您最终会得到与前面所示相同的结果。 (即:{ some_user_id: 1 })在您的客户端上,您可以计算结果对象中的键,以了解在任何给定日期范围内有多少唯一用户。