{% include anchor.html edit="true" title="Delete index" hash="delete_index" %}

{% highlight js %}
db.deleteIndex(index [, callback])
{% endhighlight %}

Delete an index, remove any orphaned design documents, and clean up any leftover data on disk.

{% include alert/start.html variant="info"%}
{% markdown %}

**pouchdb-find plugin needed:** This API requires the `pouchdb-find` plugin. See
[Mango queries](/guides/mango-queries.html) for installation instructions.

{% endmarkdown %}
{% include alert/end.html%}


#### Example Usage:

{% include code/start.html id="delete_idx" type="callback" %}
{% highlight js %}
db.deleteIndex({
  "ddoc": "_design/idx-0f3a6f73110868266fa5c688caf8acd3",
  "name": "idx-0f3a6f73110868266fa5c688caf8acd3",
  "type": "json",
  "def": {
    "fields": [
      { "foo": "asc" },
      { "bar": "asc" }
    ]
  }
}, function (err, result) {
  if (err) { return console.log(err); }
  // handle result
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_idx" type="async" %}
{% highlight js %}
try {
  var result = await db.deleteIndex({
    "ddoc": "_design/idx-0f3a6f73110868266fa5c688caf8acd3",
    "name": "idx-0f3a6f73110868266fa5c688caf8acd3",
    "type": "json",
    "def": {
      "fields": [
        { "foo": "asc" },
        { "bar": "asc" }
      ]
    }
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_idx" type="promise" %}
{% highlight js %}
db.deleteIndex({
  "ddoc": "_design/idx-0f3a6f73110868266fa5c688caf8acd3",
  "name": "idx-0f3a6f73110868266fa5c688caf8acd3",
  "type": "json",
  "def": {
    "fields": [
      { "foo": "asc" },
      { "bar": "asc" }
    ]
  }
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

#### Example Response:

{% highlight js %}
{ "ok": true }
{% endhighlight %}

Note that the easiest way to do this is to locate the index you want to delete using [`getIndexes()`](#list_indexes).
For instance, here is how you would delete the second index from that list (which should be the
one after the built-in `_all_docs` index):

{% include code/start.html id="delete_idx2" type="callback" %}
{% highlight js %}
db.getIndexes(function (err, indexesResult) {
  if (err) { return console.log(err); }
  db.deleteIndex(indexesResult.indexes[1], function (err, result) {
    if (err) { return console.log(err); }
    // handle result
  });
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_idx2" type="async" %}
{% highlight js %}
try {
  var indexesResult = await db.getIndexes();
  var result = await db.deleteIndex(indexesResult.indexes[1]);
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_idx2" type="promise" %}
{% highlight js %}
db.getIndexes().then(function (indexesResult) {
  return db.deleteIndex(indexesResult.indexes[1]);
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

**Notes:**

* You don't need to provide a `_rev` when deleting an index.
* The associated design doc is automatically deleted, assuming it only contains one index.
* There is no need to call [`viewCleanup`](#view_cleanup) to clean up any leftover data. `deleteIndex()` does this automatically for you.
