如何获取CouchDB中每种文档类型的最新文档?

时间:2019-05-14 12:39:39

标签: mapreduce couchdb cloudant

我想基于字段timestamp检索最新文档,该字段按某些字段分组(因此,每个字段唯一组合的最新文档)。

鉴于我有以下文件:

{ timestamp: 1, a: 'foo', b: 'bar' }
{ timestamp: 2, a: 'foo', b: 'baz' }
{ timestamp: 3, a: 'bar', b: 'qux' }
{ timestamp: 4, a: 'bar', b: 'qux' }

ab分组时,我需要以下文档:

{ timestamp: 1, a: 'foo', b: 'bar' }
{ timestamp: 2, a: 'foo', b: 'baz' }
{ timestamp: 4, a: 'bar', b: 'qux' }

在我的应用程序中,我想用a过滤结果,例如当我只需要为b

的每个可能值提供最新文档时

每个唯一字段组合的文档数不受限制,ab可以具有任意值。

我尝试了多种方法来解决该问题,但是我不确定哪种方法更有效。

  1. 为每次插入新文档时更新的每个唯一组合维护一个“最新”文档,并包含该唯一字段组合的最新文档的ID。
  2. 创建一个自定义的reduce函数,以过滤掉“较旧”的记录:
function mapFun(doc) {
  emit(doc.a, [doc.a, doc.b, doc.timestamp, doc._id]);
}

function reduceFun(keys, values, rereduce) {
  if (rereruce) values = [values];
  var latest = {};
  for (var i = 0; i < values.length; i++) {
    for (var j = 0; j < values[i].length; j++) {
      var value = values[i][j];
      var key = value[0] + value[1];
      if (!latest[key] || latest[key][2] < value[2]) latest[key] = value;
    }
  }
  var results = [];
  for (var key in latest) {
    results.push(latest[key]);
  }
  return results;
}

0 个答案:

没有答案