Это будет неловко. Основная идея заключается в том, что вам нужно создать представление, в котором функция карты выдает каждую возможную комбинацию тегов и стран в качестве ключа, а функция сокращения отсутствует. Таким образом, поиск ["france","luxembourg"]
вернет все документы, которые испустили этот ключ (и, следовательно, находятся на пересечении), потому что представления без функции сокращения возвращают исходящий документ для каждой записи. Таким образом, вам нужно сделать только один запрос.
Это вызывает много выбросов, но вы можете уменьшить это число, отсортировав теги как при выдаче, так и при поиске (автоматически превратить ["luxembourg","france"]
в ["france","luxembourg"]
), а также воспользовавшись возможностью CouchDB префиксы запросов (это означает, что отправка ["belgium","france","luxembourg"]
позволит вам соответствовать поискам ["belgium"]
и ["belgium","france"]
).
В приведенном выше примере для стран вы можете указать только:
// doc 1
emit(["luxembourg"],null);
emit(["france","luxembourg"],null);
// doc 2
emit(["germany"],null);
emit(["france","germany"],null);
// doc 3
emit(["luxembourg"],null);
emit(["belgium","luxembourg"],null);
emit(["france","luxembourg"],null);
emit(["belgium","france","luxembourg"],null);
В любом случае, для сложных запросов, подобных этому, рассмотрите комбинацию CouchDB-Lucene.