我在CouchDB中有一个文档,其结构如下:
{date: 1234567, authors: ['Foo', 'Bar']}
我的目标是弄清楚某个作者的“活跃”程度。使用以下工作做得很好。
map: function(doc) {
doc.authors.forEach(function(name) {
emit(name, 1);
});
},
reduce: function(keys, values) {
return sum(values);
}
但现在我想知道我怎么能在日期:字段上设置(动态)限制?
干杯
答案 0 :(得分:1)
将date
放入密钥:
图:
function (doc) {
if (doc.authors && doc.date) {
doc.authors.forEach(function (author) {
emit([author, doc.date], 1);
});
}
}
减少
_sum
并使用(正确的url编码)查询:
startkey=['author',STARTDATE]&endkey=['author',ENDDATE]&group_level=1
如果您希望多个作者只有一个查询,则不能使用reduce函数,因为reduce结果的大小不能取决于行数。以下是一些可能的解决方案:
最常见的解决方案是使用list functions。但请记住,它们在服务器上很重,因为结果不像map / reduce一样保存在磁盘上。
如果您有预定义的句点(例如月或年),则可以为doc.date所属的每个句点发出一行,并将句点作为键中的第一个元素。
例如,使用以下map函数(与之前相同的reduce):
function (doc) {
if (doc.authors && doc.date) {
var periods = getPeriod(doc.date);
doc.authors.forEach(function (author) {
periods.forEach(function (period) {
emit([period, author], 1);
});
});
}
}
并查询:
startkey=[PERIOD]&endkey=[PERIOD,{}]&group_level=exact
此处getPeriod()
是您必须定义的函数,以获取给定日期所属的句点数组。