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