CouchDB чувствителен к регистру и опций OR, как в MySQL - PullRequest
6 голосов
/ 06 декабря 2010

Я совсем новичок в couchDB и мне нужна небольшая поддержка.

В MySQL я мог бы просто выполнить этот запрос:

SELECT `name`, `id`, `desc` FROM `table` 
WHERE `name`="jack" OR `cat` LIKE "%|52224|%";

И вот две мои проблемы:

Я начал создавать представление (все еще без опции Like и всего остального):

function(doc) {
    emit([doc.name, doc.cat], {
"name" : doc.name,
"desc" : doc.desc,
"id" : doc._id
});
}

1.Когда я использую «emit ([doc.name»), строка должна совпадать на 100% (также с учетом регистра).
-> Как сделать этот параметр нечувствительным к регистру?
Что я могу попросить ("Jack, jack, jAck, JAck,...) как в mysql?

2. Как создать опцию ИЛИ?

Когда я использую [doc.name, doc.cat], я также вынужден запросить обе переменные.
Но когда у меня есть только один из них,
как я могу запросить, не создавая для каждой опции свое собственное представление?

1 Ответ

9 голосов
/ 06 декабря 2010

Чтобы реализовать поиск без учета регистра, вам просто нужно преобразовать ключи в нижний регистр:

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 для реализации сложных запросов.

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