Создание индекса нумерации страниц в CouchDB? - PullRequest
2 голосов
/ 05 сентября 2010

Я пытаюсь создать представление индекса нумерации страниц в CouchDB, которое перечисляет doc._id для каждого найденного N-го документа.

Я написал следующую функцию карты, но pageIndex переменная не всегда надежно начинается с 1 - фактически она кажется произвольно изменяемой в зависимости от переданного значения или длины индекса (например, 50, 55, 10, 25 - все начинается с другого файла, хотя мне кажется,чтобы получить правильное количество отправленных файлов).

function(doc) {
  if (doc.type == 'log') {
    if (!pageIndex || pageIndex > 50) {
      pageIndex = 1;
      emit(doc.timestamp, null);
    }
    pageIndex++;
  }
}

Что я здесь не так делаю?Как эксперт CouchDB может построить это представление?

Обратите внимание, что я не хочу использовать метод "startkey + count + 1", который был упомянут в других местах , поскольку я хотел быбыть в состоянии перейти на определенную страницу или последнюю страницу (ожидания пользователей и все), я хотел бы иметь дружественный URI "? page = 5" вместо "? startkey = 348ca1829328edefe3c5b38b3a1f36d1e988084b", и я бы скорее сделал CouchDBэта работа вместо того, чтобы заполнить мое приложение, если я могу помочь.

Спасибо!

1 Ответ

6 голосов
/ 06 сентября 2010

Функции просмотра (map и reduce) являются чисто функциональными.Побочные эффекты, такие как установка глобальной переменной, не поддерживаются.(Когда вы перемещаете свое приложение на BigCouch , как несколько независимых серверов с произвольными подмножествами данных могут узнать, что такое pageIndex?)

Поэтому ответ должен включать традиционный *Функция 1008 *, возможно, с отметкой времени.

function(doc) {
  if (doc.type == 'log') {
    emit(doc.timestamp, null);
  }
}

Как вы можете получить каждый 50-й документ?Самый простой способ - добавить параметр skip=0, skip=50 или skip=100.Однако это не идеально (см. Ниже).

Способ предварительной выборки точных идентификаторов каждого 50-го документа - это функция _list, которая выводит только каждую 50-ую строку.(На практике вы можете использовать Mustache.JS или другую библиотеку шаблонов для построения HTML.)

function() {
  var ddoc = this,
      pageIndex = 0,
      row;

  send("[");
  while(row = getRow()) {
    if(pageIndex % 50 == 0) {
      send(JSON.stringify(row));
    }
    pageIndex += 1;
  }
  send("]");
}

Это будет работать во многих ситуациях, однако не идеально.Вот некоторые соображения, о которых я думаю - не обязательно показывать подсказки, но это зависит от вашей конкретной ситуации.

Есть причина, по которой красивые URL не рекомендуются.Что это значит, если я загружаю страницу 1, то в первые 50 вставляется куча документов, а затем я нажимаю на страницу 2?Если данные сильно меняются, то нет идеального взаимодействия с пользователем, пользователь должен как-то почувствовать изменение данных.

Параметр skip и пример функции _list имеют ту же проблему: они не масштабируются,С skip вы по-прежнему касаетесь каждой строки в представлении, начиная с самого начала: находите его в файле базы данных, читаете его с диска, а затем игнорируете его, снова и снова, ряд за строкой, покавы нажали skip значение.Для небольших значений это довольно удобно, но так как вы группируете страницы по 50, я должен представить, что у вас будет тысячи или более строк.Это может замедлить просмотр страниц, так как база данных вращается в большинстве случаев.

В примере _list есть похожая проблема, однако вы загружаете всю работу спереди, просматривая весь вид с самого началазавершить и (предположительно) отправить соответствующие идентификаторы документов клиенту, чтобы он мог быстро перемещаться по страницам.Но с сотнями тысяч документов (вы называете их «журналом», так что я предполагаю, что у вас будет тонна) это будет чрезвычайно медленный запрос, который не кэшируется.

В целом, для небольших наборов данных выс помощью форм page=1, page=2 вы можете столкнуться с проблемами по мере того, как ваш набор данных станет больше.С выпуском BigCouch CouchDB стал еще лучше для хранения и анализа журналов, поэтому (если это то, что вы делаете), вы определенно захотите подумать о том, насколько велика масштабирование.

...