Запрос на дополнение набора в CouchDB - PullRequest
1 голос
/ 09 июня 2011

Я не уверен, что есть хороший способ использовать средства, предоставляемые CouchDB, но я бы хотел как-то извлечь относительное дополнение наборов двух разных типов документов по определенному ключу.

Например, допустим, у меня есть документы, представляющие user s и post s, оба из которых имеют (уникальное) поле username.Существует проверка, обеспечивающая наличие user документа для username в каждом post, но может быть любое число post документов с заданным username, не включая ни одного.Создать представление, подсчитывающее количество post с на username, тривиально.Представление может даже включать нулевые отсчеты, выпуская нулевые постсчета для документов user в функции карты представлений.Что я хочу сделать, так это получить только список пользователей, у которых ноль связанных сообщений.

Можно построить представление, которое я описал выше, и отфильтровать на стороне клиента результаты с нулевым значением., но в моей реальной ситуации количество результатов может быть очень, очень большим, а интересные результаты - относительно небольшой долей от общего числа.Есть ли способ сделать это с другой стороны и получить только интересные результаты?

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Я бы написал функцию карты, чтобы перебирать документы и выдавать пользователям (или просто имена пользователей) 0 сообщений.

Затем я писал бы функцию списка, чтобы перебирать результаты функции карты и форматировать их.как вы хотите (JSON, CSV и т. д.).

(я бы НЕ использовал функцию уменьшения для форматирования результатов, даже если кажется, что функция уменьшения работает нормально при разработке. Это только мой собственный опыт из уроковвыучил трудный путь.)

0 голосов
/ 10 июня 2011

Лично я бы фильтровал на стороне клиента, пока у меня не возникли проблемы с производительностью. Затем я бы, вероятно, использовал _filter технику Тедди - все довольно стандартные вещи CouchDB.

Однако я наткнулся (ИМО) на элегантный способ найти набор дополнений. Я описал это при изучении как найти документы отсутствует поле .

Основная идея

Нахождение нечленов вашего взгляда, очевидно, невозможно сделать простым запросом (и простым сканированием индекса). Однако , это можно сделать в постоянной памяти, и линейное время, путем одновременной итерации двух результатов запроса одновременно.

Один запрос для всех возможных идентификаторов документов. Другой запрос предназначен для соответствующих документов (тех, которые вы не хотите). Важно отметить, что CouchDB сортирует результаты запроса , поэтому вы можете эффективно рассчитать дополнение.

Смотрите мои данные в предыдущем вопросе. Основная идея заключается в том, что вы выполняете итерацию по обоим (отсортированным) спискам одновременно, и когда вы говорите «эй, этот идентификатор документа указан в полном наборе, но отсутствует в подмножестве, что является хитом.

(Вам не нужно запрашивать _all_docs, вам просто нужно два запроса к CouchDB: один возвращает все возможные значения, а другой возвращает не для подсчета.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...