{% include anchor.html edit="true" title="Delete a document" hash="delete_document"%}

{% highlight js %}
db.remove(doc, [options], [callback])
{% endhighlight %}

Or:

{% highlight js %}
db.remove(docId, docRev, [options], [callback])
{% endhighlight %}


Deletes the document. `doc` is required to be a document with at least an `_id` and a `_rev` property. Sending the full document will work as well.

See [filtered replication](http://pouchdb.com/api.html#filtered-replication) for why you might want to use `put()` with `{_deleted: true}` instead.

#### Example Usage:

{% include code/start.html id="delete_doc" type="callback" %}
{% highlight js %}
db.get('mydoc', function(err, doc) {
  if (err) { return console.log(err); }
  db.remove(doc, function(err, response) {
    if (err) { return console.log(err); }
    // handle response
  });
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc" type="async" %}
{% highlight js %}
try {
  var doc = await db.get('mydoc');
  var response = await db.remove(doc);
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc" type="promise" %}
{% highlight js %}
db.get('mydoc').then(function(doc) {
  return db.remove(doc);
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

#### Example Response:

{% highlight js %}
{
  "ok": true,
  "id": "mydoc",
  "rev": "2-9AF304BE281790604D1D8A4B0F4C9ADB"
}
{% endhighlight %}

You can also delete a document by just providing an `id` and `rev`:

{% include code/start.html id="delete_doc3" type="callback" %}
{% highlight js %}
db.get('mydoc', function(err, doc) {
  if (err) { return console.log(err); }
  db.remove(doc._id, doc._rev, function(err, response) {
    if (err) { return console.log(err); }
    // handle response
  });
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc3" type="async" %}
{% highlight js %}
try {
  var doc = await db.get('mydoc');
  var response = await db.remove(doc._id, doc._rev);
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc3" type="promise" %}
{% highlight js %}
db.get('mydoc').then(function(doc) {
  return db.remove(doc._id, doc._rev);
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

You can also delete a document by using `put()` with `{_deleted: true}`:

{% include code/start.html id="delete_doc2" type="callback" %}
{% highlight js %}
db.get('mydoc', function(err, doc) {
  if (err) { return console.log(err); }
  doc._deleted = true;
  db.put(doc, function(err, response) {
    if (err) { return console.log(err); }
    // handle response
  });
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc2" type="async" %}
{% highlight js %}
try {
  var doc = await db.get('mydoc');
  doc._deleted = true;
  var result = await db.put(doc);
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="delete_doc2" type="promise" %}
{% highlight js %}
db.get('mydoc').then(function(doc) {
  doc._deleted = true;
  return db.put(doc);
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}
