Образец большого CouchDB базы данных для локального развития, избегая длительного представления
-
25-09-2019 - |
Вопрос
CouchDB удобен для разработки (CouchApps) локально, а затем нажимает на удаленное производство. К сожалению, с наборами данных размером производства, работа на представлениях может быть громоздким.
Каковы хорошие способы взять образцы базы данных CouchDB для использования в местном развитии?
Решение
Ответ отфильтрован репликацией. Мне нравится делать это в двух частях:
- Реплицируйте производственную базу данных,
example_db
на мой локальный сервер какexample_db_full
- Выполнить фильтрованную репликацию от
example_db_full
кexample_db
, где фильтр вырезает достаточно данных, так что сборки быстры, но сохраняют достаточно данных, чтобы я мог подтвердить мой код.
Какие документы для выбора могут быть определены для приложения. В это время я доволен простым случайным проходом / сбоями с процентом, который я могу указать. Случайность является последовательной (т. Е. О том же документе всегда проходит или всегда терпит неудачу.)
Моя техника - нормализовать контрольную сумму контента в документе _rev
поле на диапазоне [0,0, 1,0). Тогда я просто указываю какую-то фракцию (например, 0.01
), и если нормализованное значение контрольной суммы составляет <= мою фракцию, документ проходит.
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);
}