CouchDB, all_docs и фильтрация проектных документов с помощью endkey

Во-первых, этот вопрос - фильтрация проектных документов из all_docs - уже, казалось, был решен, как описано здесь: https://plus.google.com/+JasonDeRose/posts/1iP5tu3wVqw

/mydb/_all_docs?endkey=%22_%22

и работал на первом месте. Однако внезапно в другой настройке (фактически просто в другом развертывании) запрос возвращает только пустую коллекцию []. Похоже, что порядок изменился, без endkey="_" возвращается полная коллекция (включая проектные документы). Я пробовал различные комбинации endkey/startkey, но не смог снова отфильтровать проектные документы.

Наконец, я добавил фильтр и переключился на _changes? Include_docs = true, чтобы загрузить исходные документы. Я также думал об определении представления, но мне не нравится, что это приводит к репликации данных и некоторым неудобствам с фидом изменений (необходим в другом контексте). Фильтр, с другой стороны, будет выполняться для каждого документа.

Это ошибка, что endkey=%22_%22 больше не работает и есть более удобный, все еще работающий способ?

1 ответ

Решение

/_all_docs - это особый случай для CouchDB. Вместо обычного сопоставления Unicode используется сопоставление ASCII.

Символ '_' в порядке ascii отображается между заглавными и строчными буквами. Поэтому, если ваш идентификатор документа начинается со строчных букв (поведение по умолчанию), они будут отображаться после любой документации проекта. Если ваши идентификаторы документов начинаются с заглавных букв, они будут отображаться до оформления документов.

Попробуйте создать документ с идентификатором: "ABC". Вы увидите его до того, как в этом случае сработает документация по дизайну, и ваш прием по фильтрации документов по дизайну будет работать.

Тем не менее, я рекомендую вам полностью прекратить использование представления _all_docs. Вместо этого используйте обычную функциональность представления. Когда вы создаете представление, CouchDB автоматически пропускает дизайнерские документы для вас. Так что если ваш взгляд выглядел так:

function(doc){
  emit(doc._id, null);
}

Вы можете запросить это без начального или конечного ключа и получить все документы без проектных документов.

Кроме того, обратите внимание на порядок сортировки Unicode. Это порядок, в котором будут отображаться все ваши другие представления, и это важно понимать при работе с CouchDB. Вы можете прочитать все об этом здесь: https://wiki.apache.org/couchdb/View_collation

Другие вопросы по тегам