Выполнение запроса WHERE-IN в CouchDB

Я хотел бы запросить список конкретных документов одним вызовом CouchDB.

С SQL я бы сделал что-то вроде

SELECT *
FROM database.table
WHERE database.table.id
IN (2,4,56);

Как это сделать в CouchDB с помощью _id или другого поля?


person johowie    schedule 06.10.2012    source источник


Ответы (2)


Вам нужно использовать представления keys параметр запроса для получения записей с ключами в указанном наборе.

function(doc){
    emit(doc.table.id, null);
}

А потом

GET /db/_design/ddoc_name/_view/by_table_id?keys=[2,4,56]

Чтобы получить содержимое документа одновременно, просто добавьте параметр запроса include_docs=True к вашему запросу.

UPD: Возможно, вам будет интересно получить документы по этим идентификаторам ссылок (2,4,56). По умолчанию CouchDB просматривает «сопоставляет» выданные ключи с документами, которым они принадлежат. Чтобы изменить это поведение, вы можете использовать трюк с связанными документами:

function(doc){
    emit(doc.table.id, {'_id': doc.table.id});
}

А теперь запрос

GET /db/_design/ddoc_name/_view/by_table_id?keys=[2,4,56]&include_docs=True

вернет строки с полем id, указывающим на документ, который содержит ключи 2, 4 и 56, и doc, который содержит ссылочное содержимое документа.

person Kxepal    schedule 06.10.2012
comment
использование параметра keys в URL-адресе многое проясняет для меня. У меня только что было Ага! момент. спасибо (ps. Орфографическая ошибка в ссылке «связанные документы») - person johowie; 07.10.2012

В CouchDB Bulk document APi используется для этого:

curl -d '{"keys":["2","4", "56"]}' -X POST http://127.0.0.1:5984/foo/_all_docs?include_docs=true

http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API

person Antonio    schedule 07.10.2012
comment
Кроме того, знаете ли вы, есть ли существенная разница в производительности API массового документа по сравнению с записью view, которая выдает emit(doc._id, doc) ИЛИ emit(doc._id, doc._id) с ?include_docs=true - person johowie; 11.10.2012
comment
Да, это работает для идентификаторов, это правильно. Насколько я знаю, _all_docs также является представлением, поэтому разницы в производительности быть не должно. - person Antonio; 11.10.2012