This project is not being actively maintained. If you are interested in helping to maintain this project, take a look at the open issues on GitHub and submit pull requests.

Doctrine CouchDB Client

Doctrine CouchDB Client is a simple API that wraps around CouchDBs v2.x HTTP API.

For CouchDB 1.x, please use our release/1.0.0 branch.

Features

  • Create, Delete, List Databases
  • Create, Update, Delete Documents
  • Bulk API for Creating/Updating Documents
  • Find Documents by ID
  • Generate UUIDs
  • Design Documents
  • Query _all_docs view
  • Query Changes Feed
  • Query Views
  • Compaction Info and Triggering APIs
  • Replication API
  • Symfony Console Commands
  • Find Documents using Mango Query

Installation

With Composer:

composer require doctrine/couchdb

Usage

Basic Operations

Covering the basic CRUD Operations for databases and documents:

<?phpdeclare(strict_types=1);use Doctrine\CouchDB\CouchDBClient;use Doctrine\CouchDB\Mango\MangoQuery;use Doctrine\CouchDB\View\DesignDocument;$client = CouchDBClient::create(['dbname' => 'doctrine_example']);// Create a database.$client->createDatabase($client->getDatabase());// Create a new document.list($id, $rev) = $client->postDocument(['foo' => 'bar']);// Update a existing document. This will increment the revision.list($id, $rev) = $client->putDocument(['foo' => 'baz'], $id, $rev);// Fetch single document by id.$doc = $client->findDocument($id);// Fetch multiple documents at once.$docs = $client->findDocuments([$id]);// Return all documents from database (_all_docs?include_docs=true).$allDocs = $client->allDocs();// Delete a single document.$client->deleteDocument($id, $rev);// Delete a database.$client->deleteDatabase($client->getDatabase());// Search documents using Mango Query CouchDB v2.x$selector = ['_id' => ['$gt' => null]];$options  = ['limit' => 1,'skip' => 1,'use_index' => ['_design/doc','index'],'sort' => [['_id' => 'desc']]];$query    = new MangoQuery($selector, $options);$docs     = $client->find($query);$query = new MangoQuery();$query->select(['_id', 'name'])->where(['$and'=> [  [    'name'=> ['$eq' => 'Under the Dome'],    'genres'=> [      '$in'=> ['Drama','Comedy'],    ],  ],])->sort([['_id' => 'desc']])->limit(1)->skip(1)->use_index(['_design/doc', 'index']);$docs = $client->find($query);

Views

A simple example demonstrating how to create views and query them:

class ArticlesDesignDocument implements DesignDocument{    public function getData()    {        return [            'language' => 'javascript',            'views' => [                'by_author' => [                    'map' => "function(doc) {                        if('article' == doc.type) {                            emit(doc.author, doc._id);                        }                    }",                    'reduce' => '_count',                ],            ],        ];    }}$client->createDesignDocument('articles', new ArticlesDesignDocument());// Fill database with some data.foreach (['Alice', 'Bob', 'Bob'] as $author) {    $client->postDocument([        'type' => 'article',        'author' => $author,        'content' => 'Lorem ipsum',    ]);}// Query all articles.$query = $client->createViewQuery('articles', 'by_author');$query->setReduce(false);$query->setIncludeDocs(true);$result = $query->execute();foreach ($result as $row) {    $doc = $row['doc'];    echo 'Article by ', $doc['author'], ': ', $doc['content'], "\n";}// Article by Alice: Lorem ipsum// Article by Bob: Lorem ipsum// Article by Bob: Lorem ipsum// Query all articles written by bob.$query = $client->createViewQuery('articles', 'by_author');$query->setKey('Bob');// ...// Query the _count of articles each author has written.$query = $client->createViewQuery('articles', 'by_author');$query->setReduce(true);$query->setGroupLevel(1); // group_level=1 means grouping by author.$result = $query->execute();foreach ($result as $row) {    echo 'Author ', $row['key'], ' has written ', $row['value'], ' articles', "\n";}// Author Alice has written 1 articles// Author Bob has written 2 articles