Ответ фильтруется репликацией. Мне нравится делать это в двух частях:
- Копировать производственную базу данных
example_db
на мой локальный сервер как example_db_full
- Выполните отфильтрованную репликацию со
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);
}