Этот запрос является соединением ваших данных. (Нет, это не фактическое утверждение JOIN
, но я имею в виду, что вы задаете 3 разных вопроса и «объединяете» результаты в ответе.)
Решение 1. Просто выполните несколько запросов.
Предположим, вы делаете 2 просмотра, значение равно status
, а ключи такие:
Сохраняйте карту (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 может не подходить для вашего приложения.