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:

1<?php declare(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);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

Views

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

1class 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62