| {% include anchor.html edit="true" title="Fetch a batch of documents" hash="batch_fetch" %} | |
| {% highlight js %} | |
| db.allDocs([options], [callback]) | |
| {% endhighlight %} | |
| Fetch multiple documents, indexed and sorted by the `_id`. Deleted documents are only included if `options.keys` is specified. | |
| ### Options | |
| All options default to `false` unless otherwise specified. | |
| * `options.include_docs`: Include the document itself in each row in the `doc` field. Otherwise by default you only get the `_id` and `_rev` properties. | |
| - `options.conflicts`: Include conflict information in the `_conflicts` field of a doc. | |
| - `options.attachments`: Include attachment data as base64-encoded string. | |
| - `options.binary`: Return attachment data as Blobs/Buffers, instead of as base64-encoded strings. | |
| * `options.startkey` & `options.endkey`: Get documents with IDs in a certain range (inclusive/inclusive). | |
| * `options.inclusive_end`: Include documents having an ID equal to the given `options.endkey`. Default: `true`. | |
| * `options.limit`: Maximum number of documents to return. | |
| * `options.skip`: Number of docs to skip before returning (warning: poor performance on IndexedDB/LevelDB!). | |
| * `options.descending`: Reverse the order of the output documents. Note that the order of `startkey` and `endkey` is reversed when `descending`:`true`. | |
| * `options.key`: Only return documents with IDs matching this string key. | |
| * `options.keys`: Array of string keys to fetch in a single shot. | |
| - Neither `startkey` nor `endkey` can be specified with this option. | |
| - The rows are returned in the same order as the supplied `keys` array. | |
| - The row for a deleted document will have the revision ID of the deletion, and an extra key `"deleted":true` in the `value` property. | |
| - The row for a nonexistent document will just contain an `"error"` property with the value `"not_found"`. | |
| - For details, see the [CouchDB query options documentation](http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options). | |
| **Notes:** For pagination, `options.limit` and `options.skip` are also available, but the same performance concerns as in CouchDB apply. Use the [startkey/endkey pattern](http://docs.couchdb.org/en/latest/couchapp/views/pagination.html) instead. | |
| #### Example Usage: | |
| {% include code/start.html id="all_docs" type="callback" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true | |
| }, function(err, response) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var result = await db.allDocs({ | |
| include_docs: true, | |
| attachments: true | |
| }); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs" type="promise" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true | |
| }).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| #### Example Response: | |
| {% highlight js %} | |
| { | |
| "offset": 0, | |
| "total_rows": 1, | |
| "rows": [{ | |
| "doc": { | |
| "_id": "0B3358C1-BA4B-4186-8795-9024203EB7DD", | |
| "_rev": "1-5782E71F1E4BF698FA3793D9D5A96393", | |
| "title": "Sound and Vision", | |
| "_attachments": { | |
| "attachment/its-id": { | |
| "content_type": "image/jpg", | |
| "data": "R0lGODlhAQABAIAAAP7//wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==", | |
| "digest": "md5-57e396baedfe1a034590339082b9abce" | |
| } | |
| } | |
| }, | |
| "id": "0B3358C1-BA4B-4186-8795-9024203EB7DD", | |
| "key": "0B3358C1-BA4B-4186-8795-9024203EB7DD", | |
| "value": { | |
| "rev": "1-5782E71F1E4BF698FA3793D9D5A96393" | |
| } | |
| }] | |
| } | |
| {% endhighlight %} | |
| In the response, you have three things: | |
| * `total_rows` the total number of non-deleted documents in the database | |
| * `offset` the `skip` if provided, or in CouchDB the actual offset | |
| * `rows`: rows containing the documents, or just the `_id`/`_revs` if you didn't set `include_docs` to `true`. | |
| You can use `startkey`/`endkey` to find all docs in a range: | |
| {% include code/start.html id="all_docs_2" type="callback" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'bar', | |
| endkey: 'quux' | |
| }, function(err, response) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs_2" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var result = await db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'bar', | |
| endkey: 'quux' | |
| }); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs_2" type="promise" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'bar', | |
| endkey: 'quux' | |
| }).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| This will return all docs with `_id`s between `'bar'` and `'quux'`. | |
| #### Prefix search | |
| You can do prefix search in `allDocs()` – i.e. "give me all the documents whose `_id`s start with `'foo'`" – by using the special high Unicode character `'\uffff'`: | |
| {% include code/start.html id="all_docs_3" type="callback" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'foo', | |
| endkey: 'foo\uffff' | |
| }, function(err, response) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs_3" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var result = await db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'foo', | |
| endkey: 'foo\uffff' | |
| }); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="all_docs_3" type="promise" %} | |
| {% highlight js %} | |
| db.allDocs({ | |
| include_docs: true, | |
| attachments: true, | |
| startkey: 'foo', | |
| endkey: 'foo\uffff' | |
| }).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| This works because CouchDB/PouchDB `_id`s are sorted [lexicographically](http://docs.couchdb.org/en/latest/couchapp/views/collation.html). |