Чтобы реализовать поиск без учета регистра, вам просто нужно преобразовать ключи в нижний регистр:
emit([doc.name.toLowerCase(), doc.cat.toLowerCase()])
Теперь, если вы преобразуете свой запрос в нижний регистр, у вас будет совпадение без учета регистра.Проблема этого решения заключается в том, что если вы хотите выполнять поиск с учетом и без учета регистра, вы можете либо выдать оба значения:
[doc.name.toLowerCase(), doc.name, doc.cat]
и использовать клавиши начала и конца для фильтрации результатов, либо создать отдельное представление.
Второй вопрос немного сложнее реализовать.
Прежде всего, если вам нужно фильтровать только по doc.name, вы можете отправить запрос с помощью startkey=["jack",0]
и endkey=["jack",'zzzzzz']
, чтовернет все документы с doc.name="jack"
и doc.cat
между 0
и 'zzzzzz'
(возможно, есть лучший способ сказать «любой кот», к сожалению, я не могу сейчас его найти).
Если выЕсли вам нужно реальное ИЛИ, то для каждого документа вы должны создать две строки:
emit(doc.name, doc); emit(doc.cat, doc);
Таким образом, вы можете ПОСТАВИТЬ необходимые ключи с вашим запросом: {"keys": ["jack", "cat_name"]}
Это вернет каждый документ слибо "jack"
ИЛИ "cat_name"
ключ.Однако документы с обоими будут возвращены дважды, поэтому вам придется отфильтровать дубликаты в коде приложения.
Вы также можете использовать couchdb-lucene , который решит обе ваши проблемы и, возможно, многое другое.Это популярный выбор среди пользователей couchdb для реализации сложных запросов.