Эта техника называется Тайский массаж . Используйте его, чтобы эффективно находить документы , а не в представлении, если (и только если) представление имеет ключ по идентификатору документа.
function(doc) {
// _view/fields map, showing all fields of all docs
// In principle you could emit e.g. "foo.bar.baz"
// for nested objects. Obviously I do not.
for (var field in doc)
emit(field, doc._id);
}
function(keys, vals, is_rerun) {
// _view/fields reduce; could also be the string "_count"
return re ? sum(vals) : vals.length;
}
Чтобы найти документы, не имеющие этого поля,
GET /db/_all_docs
и запомните все идентификаторы
GET /db/_design/ex/_view/fields?reduce=false&key="some_field"
- Сравните идентификаторы из
_all_docs
с идентификаторами из запроса.
Идентификаторы в _all_docs
, но не в представлении, - это те, в которых отсутствует это поле.
Звучит плохо, чтобы хранить идентификаторы в памяти, но это не обязательно! Вы можете использовать стратегию сортировки слиянием, повторяя оба запроса одновременно. Вы начинаете с первого идентификатора , имеющего список (из вида) и первого идентификатора из полного списка (из _all_docs).
- Если full <<em> имеет , поле отсутствует, повторите со следующим full element
- Если full = имеет , у него есть поле, повторить со следующим full element
- Если полный > имеет , повторить со следующим имеет элемент
В зависимости от вашего языка это может быть сложно. Но это довольно просто, например, в Javascript или других основанных на событиях средах программирования.