Как мне создать представление couchdb для следующего случая? - PullRequest
2 голосов
/ 12 октября 2011

Я мигрирую приложение из mySQL в couchDB.(Хорошо, пожалуйста, не выносите суждений по этому вопросу).

Есть функция с подписью

getUserBy($column, $value) 

Теперь вы можете видеть, что в случае SQL это тривиальная задача - создать запрос и запустить его.

Однако, что касается couchDB, я должен писать представления с функциями карты

В настоящее время у меня много представлений, таких как

get_user_by_name
get_user_by_email 

и так далее.Кто-нибудь может предложить лучший и в то же время масштабируемый способ сделать это?

1 Ответ

3 голосов
/ 12 октября 2011

Конечно!Один из моих любимых взглядов за его мощность - by_field.Это довольно простая функция карты.

function(doc) {
    // by_field: map function
    // A single view for every field in every document!
    var field, key;

    for (field in doc) {
        key = [field, doc[field]];
        emit(key, 1);
    }
}

Предположим, что у ваших документов есть поле .name для их имени и .email для их адреса электронной почты.

Чтобы получить пользователей по имени (например, "Алиса" и "Боб"):

GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Alice"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","Bob"]

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

GET /db/_design/example/_view/by_field?include_docs=true&key=["email","alice@gmail.com"]
GET /db/_design/example/_view/by_field?include_docs=true&key=["name","bob@gmail.com"]

Причина, по которой мне нравится выделять 1, заключается в том,так что вы можете написать функции Reduce позже, чтобы использовать sum() для простого добавления документов, соответствующих вашему запросу.

...