Пример большой базы данных CouchDB для локальной разработки, избегая длинных сборок - PullRequest
2 голосов
/ 31 августа 2010

CouchDB удобно разрабатывать (CouchApps) локально, а затем внедрять в удаленное производство. К сожалению, с производственными наборами данных работа с представлениями может быть громоздкой.

Каковы хорошие способы взять образцы базы данных CouchDB для использования в локальной разработке?

1 Ответ

2 голосов
/ 31 августа 2010

Ответ фильтруется репликацией. Мне нравится делать это в двух частях:

  1. Копировать производственную базу данных example_db на мой локальный сервер как example_db_full
  2. Выполните отфильтрованную репликацию со example_db_full до example_db, где фильтр отсекает достаточно данных, поэтому сборка происходит быстро, но сохраняет достаточно данных, чтобы я мог подтвердить, что мой код работает.

Какие документы для выбора могут зависеть от конкретного приложения. В настоящее время меня устраивает простой случайный проход / сбой с процентом, который я могу указать. Случайность постоянна (т. Е. Один и тот же документ всегда проходит или всегда терпит неудачу.)

Моя методика - нормализовать контрольную сумму содержимого в поле _rev документа в диапазоне [0.0, 1.0). Затем я просто указываю некоторую дробь (например, 0.01), и если нормализованное значение контрольной суммы <= моя дробь, документ проходит. </p>

function(doc, req) {
  if(/^_design\//.test(doc._id))
    return true;

  if(!req.query.p)
    throw {error: "Must supply a 'p' parameter with the fraction"
                  + " of documents to pass [0.0-1.0]"};

  var p = parseFloat(req.query.p);
  if(!(p >= 0.0 && p <= 1.0)) // Also catches NaN
    throw {error: "Must supply a 'p' parameter with the fraction of documents"
                  + " to pass [0.0-1.0]"};

  // Consider the first 8 characters of the doc checksum (for now, taken
  // from _rev) as a real number on the range [0.0, 1.0), i.e.
  // ["00000000", "ffffffff").
  var ONE = 4294967295; // parseInt("ffffffff", 16);
  var doc_val = parseInt(doc._rev.match(/^\d+-([0-9a-f]{8})/)[1], 16);

  return doc_val <= (ONE * p);
}
...