Как получить последний документ для каждого типа документа в CouchDB? - PullRequest
0 голосов
/ 14 мая 2019

Я бы хотел получить новейшие документы на основе поля 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' }

Мне нужны следующие документы, когда я группирую их по a и b:

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

В моем приложении я хочу отфильтровать результаты поa, например,когда мне нужны только самые последние документы для каждого возможного значения b

Количество документов на уникальную комбинацию полей не ограничено, a и b могут иметь произвольные значения.

Я пробовал несколько подходов для решения проблемы, но я не уверен, какой из них более эффективен.

  1. Сохранение «последнего» документа для каждой уникальной комбинации, которая обновляется каждый раз, когда вставляется новый документи содержит идентификатор самого последнего документа для этой уникальной комбинации полей.
  2. Создайте пользовательскую функцию сокращения, которая отфильтровывает «старые» записи:
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;
}
...