我的文件符合以下格式:
{
"_id": "some_doc_id",
"user": "some_user_id",
"date": "2015-09-15",
…
}
可以使用同一个用户拥有多个文档。我想计算两个日期之间有多少不同的用户。例如。在'2015-09-15'和'2015-09-25之间,有745个不同的用户。
在SQL中,我会写这个查询:
SELECT COUNT(DISTINCT user)
FROM documents
WHERE date BETWEEN '2015-09-15' and '2015-09-25'
谢谢。
答案 0 :(得分:2)
我会使用地图函数,如:
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;
}, {});
}
}
这是一个自定义缩小功能,所以请耐心等待我的简要说明。正常情况(第二个分支,而不是rereduce
)基本上会计算它找到的值。结果是像{ some_user_id: 1 }
。
rereduce
分支基本上采用了几个简化对象,并将它们(及其计数)合并为1个简化结果。 (您可以阅读有关减少和重新减少here)
从那里,您可以使用以下查询参数查询您的视图:
start_key="2015-09-15"
end_key="2015-09-25"
您最终会得到与前面所示相同的结果。 (即:{ some_user_id: 1 }
)在您的客户端上,您可以对结果对象中的键进行计数,以了解任何给定日期范围内有多少个唯一身份用户。