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