Статьи

Ссылка на плагин CouchDB jQuery

Мне было трудно найти документацию по плагину CouchDB jQuery, который поставляется с CouchDB. Итак, я решил создать свою собственную ссылку и поделиться ею с вами. Это должно охватывать почти весь API CouchDB, доступный через версию плагина, поставляемую с CouchDB 1.1.0.

Настроить

Политика того же происхождения эффективно требует, чтобы HTML-код, из которого загружен JavaScript, был обслужен из CouchDB (вместо этого вы можете использовать обратный прокси-сервер). Это можно сделать, прикрепив документ HTML к документу CouchDB. Вы можете сделать это вручную или с помощью CouchApps .

CouchDB поставляется с несколькими полезными библиотеками JavaScript, включая jQuery. Вот пример документа HTML, который использует преимущества библиотек JavaScript, включенных в CouchDB:

<!DOCTYPE html>
<html>
  <head>
    <title>CouchDB jQuery Examples</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script src="/_utils/script/json2.js"></script>
    <script src="/_utils/script/sha1.js"></script>
    <script src="/_utils/script/jquery.js?1.4.2"></script>
    <script src="/_utils/script/jquery.couch.js?0.11.0"></script>
    <script src="/_utils/script/jquery.dialog.js?0.11.0"></script>
  </head>
  <body>
  </body>
</html>

По умолчанию CouchDB будет использовать пустую строку в качестве префикса URL. Однако вы можете настроить это до вашего первого вызова API. Например:

$.couch.urlPrefix = "http://localhost:5984";

Как правило, вы не захотите менять это значение, так как политика одного источника запрещает вам доступ к базам данных CouchDB, размещенным в другом источнике.

API сервера

Информация о сервере

Пример JavaScript:

$.couch.info({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/ 200 OK

Консольный вывод:

{
    "couchdb"="Welcome",
    "version"="1.1.0"
}

Все БД

Пример JavaScript:

$.couch.allDbs({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/_all_dbs 200 OK

Консольный вывод:

[
    "_replicator",
    "_users"
]

Регистрация пользователя

Пример JavaScript:

var userDoc = {
    _id: "org.couchdb.user:bob",
    name: "bob"
};
$.couch.signup(userDoc, "supersecurepassword", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

PUT http://localhost:5984/_users/org.couchdb.user%3Abob 201 Created

Консольный вывод:

{
    "ok"=true,
    "id"="org.couchdb.user:bob",
    "rev"="1-230dc0625bd3c4aac735846cc152c296"
}

Авторизоваться

Пример JavaScript:

$.couch.login({
    name: "bob",
    password: "supersecurepassword",
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

POST http://localhost:5984/_session 200 OK

Консольный вывод:

{
    "ok":true,
    "name":"bob",
    "roles":[]
}

Это приведет к тому, что файл cookie AuthSession будет установлен и затем отправлен обратно на сервер при последующих запросах, аутентифицируя пользователя при каждом запросе. Длина сеанса по умолчанию составляет 10 минут, но ее можно установить в параметре конфигурации couch_httpd_auth.timeout в CouchDB.

сессия

Пример JavaScript:

$.couch.session({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/_session 200 OK

Консольный вывод:

{
    "ok":true,
    "userCtx":{
        "name":"bob",
         "roles":[]
    },
    "info":{
        "authentication_db":"_users",
        "authentication_handlers":[
            "oauth",
            "cookie",
            "default"
        ],
        "authenticated":"cookie"
    }
}

Выйти

Пример JavaScript:

$.couch.logout({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

DELETE http://_:_@localhost:5984/_session 200 OK

Консольный вывод:

{
    "ok":true
}

Это установит пустую строку для файла cookie AuthSession, что приведет к выходу клиента из системы.

Активные задачи

Пример JavaScript:

$.couch.activeTasks({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/_active_tasks 200 OK

Консольный вывод:

[]

Конфигурация сервера

Пример JavaScript:

$.couch.config({
    success: function(data) {
        console.log(data);
    }
}, "uuids", "algorithm");

Результирующий HTTP-запрос:

GET http://localhost:5984/_config/uuids/algorithm 200 OK

Консольный вывод:

"sequential"

Второй и третий параметры — это параметры раздела и опции, соответственно. Опустите параметр option, если вы хотите получить весь раздел. Опустите оба параметра section и option, если вы хотите увидеть всю конфигурацию сервера. Добавьте необязательный четвертый параметр, чтобы установить значение параметра конфигурации, что приведет к запросу PUT со значением.

Пользовательская БД

Пример JavaScript:

$.couch.userDb(function(data) {
    console.log(data);
});

Результирующий HTTP-запрос:

GET http://localhost:5984/_session 200 OK

Консольный вывод:

{
    "name"="_users",
    "uri"="../_users/"
}

URI будет относительно HTML, выполняющего скрипт.

Новый UUID

Пример JavaScript:

var uuid = $.couch.newUUID();
console.log(uuid);

Результирующий HTTP-запрос:

GET http://localhost:5984/_uuids?count=1 200 OK

Консольный вывод:

d12ee5ea1df6baa2b06451f44a0156fa

Эта функция принимает параметр count в качестве необязательного первого параметра. Если параметр count больше единицы, он будет хранить кэш UUID, которые будут возвращены при последующих вызовах, а не делать другой запрос к серверу.

Повторные

Пример JavaScript:

$.couch.replicate("mydb", "otherdb", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
}, {
    create_target: true
});

Результирующий HTTP-запрос:

POST http://localhost:5984/_replicate 200 OK

Консольный вывод:

{
    "ok":true,
    "session_id":"705797bae87456c52f5b76f44fe5f245",
    "source_last_seq":27,
    "replication_id_version":2,
    "history":[
        {
            "session_id":"705797bae87456c52f5b76f44fe5f245",
            "start_time":"Wed, 13 Jul 2011 22:40:09 GMT",
            "end_time":"Wed, 13 Jul 2011 22:40:09 GMT",
            "start_last_seq":0,
            "end_last_seq":27,
            "recorded_seq":27,
            "missing_checked":0,
            "missing_found":14,
            "docs_read":14,
            "docs_written":14,
            "doc_write_failures":0
        }
    ]
}

API базы данных

Создать базу данных

Пример JavaScript:

$.couch.db("mydb").create({
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

PUT http://localhost:5984/mydb/ 201 Created

Консольный вывод:

{
    "ok":true
}

Информация о базе данных

Пример JavaScript:

$.couch.db("mydb").info({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/mydb/ 200 OK

Консольный вывод:

{
    "db_name":"mydb",
    "doc_count":0,
    "doc_del_count":0,
    "update_seq":0,
    "purge_seq":0,
    "compact_running":false,
    "disk_size":79,
    "instance_start_time":"1310597000825187",
    "disk_format_version":5,
    "committed_update_seq":0
}

Сохранить новый документ

Пример JavaScript:

var doc = {};
$.couch.db("mydb").saveDoc(doc, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

POST http://localhost:5984/mydb/ 201 Created

Консольный вывод:

{
    "ok":true,
    "id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "rev":"1-967a00dff5e02add41819138abb3284d"
}

Открытый документ

Пример JavaScript:

$.couch.db("mydb").openDoc("d12ee5ea1df6baa2b06451f44a019ab9", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9 200 OK

Консольный вывод:

{
    "_id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "_rev":"1-967a00dff5e02add41819138abb3284d"
}

Обратите внимание, что ответ HTTP включает заголовок Etag HTTP. Если вы делаете последующий запрос для того же документа, и ваш клиент поддерживает кеширование и условные HTTP-запросы, тогда заголовок If-None-Match должен быть отправлен с использованием значения из заголовка Etag предыдущего ответа. Если документ не был изменен, то CouchDB отправит ответ 304 Not Modified без тела ответа, сохраняя пропускную способность и ускоряя ответ.

Сохранить обновленный документ

Пример JavaScript:

var doc = {
    _id: "d12ee5ea1df6baa2b06451f44a019ab9",
    _rev: "1-967a00dff5e02add41819138abb3284d",
    foo: "bar"
};
$.couch.db("mydb").saveDoc(doc, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

PUT http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9 201 Created

Консольный вывод:

{
    "ok":true,
    "id":"d12ee5ea1df6baa2b06451f44a019ab9",
    "rev":"2-13839535feb250d3d8290998b8af17c3"
}

Удалить документ

Пример JavaScript:

var doc = {
    _id: "d12ee5ea1df6baa2b06451f44a019ab9",
    _rev: "2-13839535feb250d3d8290998b8af17c3"
};
$.couch.db("mydb").removeDoc(doc, {
     success: function(data) {
         console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

DELETE http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a019ab9?rev=2-13839535… 200 OK

Консольный вывод:

{
    "id":d12ee5ea1df6baa2b06451f44a019ab9
    "ok":true,
    "rev":"3-1f04f977685e1108b4664f70b09c6f65"
}

Массовое сохранение

Пример JavaScript:

$.couch.db("mydb").bulkSave({"docs": [{}, {}]}, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

POST http://localhost:5984/mydb/_bulk_docs?successStatus=201 201 Created

Консольный вывод:

[
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a0d8",
        "rev":"1-967a00dff5e02add41819138abb3284d"
    },
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a75a",
        "rev":"1-967a00dff5e02add41819138abb3284d"
    }
]

Массовое удаление

Пример JavaScript:

var docs = [
    {
        _id: "d12ee5ea1df6baa2b06451f44a01a0d8",
        _rev: "1-967a00dff5e02add41819138abb3284d"
    },
    {
        _id: "d12ee5ea1df6baa2b06451f44a01a75a",
        _rev: "1-967a00dff5e02add41819138abb3284d"
    }
];
$.couch.db("mydb").bulkRemove({"docs": docs}, {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Результирующий HTTP-запрос:

POST http://localhost:5984/mydb/_bulk_docs?successStatus=201 201 Created

Консольный вывод:

[
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a0d8",
        "rev":"2-eec205a9d413992850a6e32678485900"
    },
    {
        "id":"d12ee5ea1df6baa2b06451f44a01a75a",
        "rev":"2-eec205a9d413992850a6e32678485900"
    }
]

Это работает почти так же, как массовое сохранение, но вместо этого устанавливает для удаленного флага значение true в документах.

Все документы

Пример JavaScript:

$.couch.db("mydb").allDocs({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET http://localhost:5984/mydb/_all_docs 200 OK

Консольный вывод:

{
    "total_rows":11,
    "offset":0,
    "rows":[
        {
            "id":"_design/default",
            "key":"_design/default",
            "value":{
                "rev":"9-5212dde9da06f1933dbe29811fc380d4"
            }
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":"d12ee5ea1df6baa2b06451f44a002cef",
            "value":{
                "rev":"1-967a00dff5e02add41819138abb3284d"
            }
        },
        …
    ]
}

Все проектные документы

Пример JavaScript:

$.couch.db("mydb").allDesignDocs({
    success: function(data) {
        console.log(data);
    }
});

Результирующий HTTP-запрос:

GET 
http://localhost:5984/mydb/_all_docs?startkey=%22_design%22&endkey=%22_design0%22 200 OK

Консольный вывод:

{
    "total_rows":11,
    "offset":0,
    "rows":[
        {
            "id":"_design/default",
            "key":"_design/default",
            "value":{
                "rev":"9-5212dde9da06f1933dbe29811fc380d4"
            }
        }
    ]
}

Все приложения

Пример JavaScript:

$.couch.db("tutorial").allApps({
    success: function(data) {
        console.log(data);
    },
    eachApp: function(appName, appPath, ddoc) {
        console.log(appName);
        console.log(appPath);
        console.log(ddoc);
    }
});

Результирующие HTTP-запросы:

GET http://localhost:5984/tutorial/_all_docs?startkey=%22_design%22&endkey=%22_design0%22 200 OK
GET http://localhost:5984/tutorial/_design/tutorial 200 OK

Консольный вывод:

tutorial
/tutorial/_design/tutorial/index.html
{
    "_id":"_design/tutorial",
    "_rev":"5-276897ecff6dc272c0b9143aa23e8a2e",
    …
}

Это сделано для удобства поиска метаданных о CouchApps.

запрос

Пример JavaScript:

var mapFunction = function(doc) {
    emit();
};
$.couch.db("mydb").query(mapFunction, "_count", "javascript", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});

Результирующий HTTP-запрос:

POST http://localhost:5984/mydb/_temp_view?reduce=false 200 OK

Консольный вывод:

{
    "total_rows":10,
    "offset":0,
    "rows":[
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a0037b5",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a003b06",
            "key":null,
            "value":null
        },
        …
    ]
}

This creates a temporary view as defined by your map and reduce functions. Temporary views are useful in development, but should be replaced with views permanently saved to design documents for production. Temporary views are slow, especially with a large number of documents.

View

JavaScript example:

$.couch.db("mydb").view("default/all", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});

Resulting HTTP request:

GET http://localhost:5984/mydb/_design/default/_view/all?reduce=false 200 OK

Console output:

{
    "total_rows":10,
    "offset":0,
    "rows":[
        {
            "id":"d12ee5ea1df6baa2b06451f44a002cef",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a0037b5",
            "key":null,
            "value":null
        },
        {
            "id":"d12ee5ea1df6baa2b06451f44a003b06",
            "key":null,
            "value":null
        },
        …
    ]
}

List

JavaScript example:

$.couch.db("mydb").list("default/all", "all", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    },
    reduce: false
});

Resulting HTTP request:

GET http://localhost:5984/mydb/_design/default/_list/all/all?reduce=false 200 OK

The console output will depend on your list’s behavior.

Compact

JavaScript example:

$.couch.db("mydb").compact({
    success: function(data) {
        console.log(data);
    }
});

Resulting HTTP request:

POST http://localhost:5984/mydb/_compact 202 Accepted

Console output:

{
    "ok":true
}

View Cleanup

JavaScript example:

$.couch.db("mydb").viewCleanup({
    success: function(data) {
        console.log(data);
    }
});

Resulting HTTP request:

POST http://localhost:5984/mydb/_view_cleanup 202 Accepted

Console output:

{
    "ok":true
}

Compact View

JavaScript example:

$.couch.db("mydb").compactView("default", {
    success: function(data) {
        console.log(data);
    }
});

Resulting HTTP request:

POST http://localhost:5984/mydb/_compact/default 202 Accepted

Console output:

{
    "ok":true
}

Changes

JavaScript example:

$.couch.db("mydb").changes().onChange(function(data) {
    console.log(data);
});

Resulting HTTP requests:

GET http://localhost:5984/mydb/ 200 OK
GET http://localhost:5984/mydb/_changes?heartbeat=10000&feed=longpoll&since=34 200 OK

This will keep a connection open until changes are detected, and then open up another connection to listen for subsequent changes starting from the next sequence.

Console output when a new document is created:

{
    "results":[
        {
            "seq":35,
            "id":"d12ee5ea1df6baa2b06451f44a01b7b5",
            "changes":[
                {
                    "rev":"1-967a00dff5e02add41819138abb3284d"
                }
            ]
        }
    ],
    "last_seq":35
}

This is very powerful feature. It allows you to listen for any changes to documents in the database and immediately respond to those changes.

Copy Document

JavaScript example:

$.couch.db("mydb").copyDoc("d12ee5ea1df6baa2b06451f44a01b7b5", {
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
}, {
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Destination", "aNewDocId");
    }
});

Resulting HTTP request:

COPY http://localhost:5984/mydb/d12ee5ea1df6baa2b06451f44a01b7b5 201 Created

Console output:

{
    "id":"aNewDocId",
    "rev":"1-967a00dff5e02add41819138abb3284d"
}

Drop Database

JavaScript example:

$.couch.db("mydb").drop({
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

Resulting HTTP request:

DELETE http://localhost:5984/mydb/ 200 OK

Console output:

{
    "ok":true
}

Source: 
http://bradley-holt.com/2011/07/couchdb-jquery-plugin-reference