Как использовать OR в представлении couchdb - PullRequest
4 голосов
/ 18 августа 2011

Я использую ruby ​​на рельсах и couchdb, но у меня проблемы с просмотром в couchdb

в sql я хочу:

выберите * от пользователя, где имя пользователя = ... или адрес электронной почты = ... и статус = ...

Как мне создать такой вид?

1 Ответ

12 голосов
/ 19 августа 2011

Этот запрос является соединением ваших данных. (Нет, это не фактическое утверждение JOIN, но я имею в виду, что вы задаете 3 разных вопроса и «объединяете» результаты в ответе.)

Решение 1. Просто выполните несколько запросов.

Предположим, вы делаете 2 просмотра, значение равно status, а ключи такие:

  • by_username
  • by_email

Сохраняйте карту (Java) или dict (Python), хэш (Perl), объект (Javascript) или любую другую структуру данных ключ / значение. Вы хотите сохранить набор подходящих пользователей и добавить к нему.

Запрос каждого представления. Если вам нужен статус, добавьте имена пользователей в свой набор. Когда все запросы завершены, у вас есть полный ответ.

О нет! Но это так медленно! На самом деле, очень часто решения медленны «в теории», но на самом деле они достаточно быстры для удовлетворения требований. У вас есть сервер Rails. Он, вероятно, имеет высокоскоростной доступ с низкой задержкой (LAN) к CouchDB. Каждый запрос в CouchDB всегда является эффективным сканированием индекса. Таким образом, вы делаете 3 запроса, бац, бац, бац! Клиент запрашивает Rails по низкоскоростному соединению с высокой задержкой (Интернет), он, вероятно, не заметит.

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

Решение 2. Секретный запрос с несколькими ключами

CouchDB фактически поддерживает некоторые запросы «ИЛИ» к представлению. Подробнее см. Параметры просмотра CouchDB .

Вам нужен один просмотр для хранения всей информации. Я предлагаю ключи массива, [status, key_type, key_value]. Например, если у вас есть два пользователя, Алиса и Боб, ключи просмотра будут такими:

["reading" , "email"   , "alice@alice.com"]
["reading" , "username", "alice"]
["sleeping", "email"   , "bob@bob.com"]
["sleeping", "username", "bob"]

Как бы вы запросили status = "sleeping" and username = "X" or email = "Y"?

Это становится несколькими запросами к представлению, каждый с различным ключом:

key=["sleeping", "username", "X"]
key=["sleeping", "email"   , "Y']

К счастью, вы можете запросить несколько ключей одновременно.

POST /db/_design/example/_view/state_and_identifiers
Content-Type: application/json

{"keys": [ ["sleeping", "username", "X"]
         , ["sleeping", "email"   , "Y']
         ]
}

CouchDB вернет все результаты в одном ответе.

Основная информация

Второе решение очень мощное, однако вам нужно проделать большую работу, чтобы получить правильный запрос. И эта техника не может всегда удовлетворять любому SQL-запросу. SQL более эффективен, чтобы задавать любые вопросы, которые вы можете придумать. Для CouchDB вы всегда должны научить его, что делать в первую очередь. Это неудобно. Но в результате запросы будут гарантированно быстрыми.

Учитывая неудобство решения 2, я лично предпочитаю решение 1. Можете ли вы присоединиться к CouchDB? Конечно! Объединения так просты. Просто сделайте несколько запросов, пока не получите необходимые данные. Что если вашему приложению нужно «присоединиться» очень часто, а использование CouchDB сложно и глючно? Это сильный признак того, что CouchDB может не подходить для вашего приложения.

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