| {% 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). |