CouchDb减少了两把钥匙

时间:2012-01-26 20:33:06

标签: couchdb

我在CouchDB中有一个文档,其结构如下:

{date: 1234567, authors: ['Foo', 'Bar']}

我的目标是弄清楚某个作者的“活跃”程度。使用以下工作做得很好。

map: function(doc) {
  doc.authors.forEach(function(name) {
    emit(name, 1);
  });
},
reduce: function(keys, values) {
  return sum(values);
}

但现在我想知道我怎么能在日期:字段上设置(动态)限制?

干杯

1 个答案:

答案 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()是您必须定义的函数,以获取给定日期所属的句点数组。