{% include anchor.html edit="true" title="Create/update a document" hash="create_document" %}

### Using db.put()
{% highlight "js" %}
db.put(doc, [options], [callback])
{% endhighlight %}

Create a new document or update an existing document. If the document already exists, you must specify its revision `_rev`, otherwise a conflict will occur.

If you want to update an existing document even if there's conflict, you should specify the base revision `_rev` and use `force=true` option, then a new conflict revision will be created.

`doc` must be a "pure JSON object", i.e. a collection of name/value pairs. If you try to store non-JSON data (for instance `Date` objects) you may see [inconsistent results]({{ site.baseurl }}/errors.html#could_not_be_cloned).

#### Example Usage:

Create a new doc with an `_id` of `'mydoc'`:

{% include code/start.html id="newDoc" type="callback" %}
{% highlight "js" %}
db.put({
  _id: 'mydoc',
  title: 'Heroes'
}, function(err, response) {
  if (err) { return console.log(err); }
  // handle response
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="newDoc" type="async" %}
{% highlight "js" %}
try {
  const response = await db.put({
    _id: 'mydoc',
    title: 'Heroes'
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="newDoc" type="promise" %}
{% highlight "js" %}
db.put({
  _id: 'mydoc',
  title: 'Heroes'
}).then(function (response) {
  // handle response
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

You can update an existing doc using `_rev`:

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

{% include code/start.html id="updateDoc" type="async" %}
{% highlight "js" %}
try {
  const doc = await db.get('mydoc');
  const response = await db.put({
    _id: 'mydoc',
    _rev: doc._rev,
    title: "Let's Dance"
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}


{% include code/start.html id="updateDoc" type="promise" %}
{% highlight "js" %}
db.get('mydoc').then(function(doc) {
  return db.put({
    _id: 'mydoc',
    _rev: doc._rev,
    title: "Let's Dance"
  });
}).then(function(response) {
  // handle response
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

#### Example Response:
{% highlight "js" %}
{
  "ok": true,
  "id": "mydoc",
  "rev": "1-A6157A5EA545C99B00FF904EEF05FD9F"
}
{% endhighlight %}

The response contains the `id` of the document, the new `rev`, and an `ok` to reassure
you that everything is okay.

### Using db.post()

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

Create a new document and let PouchDB auto-generate an `_id` for it.

#### Example Usage:

{% include code/start.html id="post_doc" type="callback" %}
{% highlight "js" %}
db.post({
  title: 'Ziggy Stardust'
}, function (err, response) {
  if (err) { return console.log(err); }
  // handle response
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="post_doc" type="async" %}
{% highlight "js" %}
try {
  const response = await db.post({
    title: 'Ziggy Stardust'
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="post_doc" type="promise" %}
{% highlight "js" %}
db.post({
  title: 'Ziggy Stardust'
}).then(function (response) {
  // handle response
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

#### Example Response:
{% highlight "js" %}
{
  "ok" : true,
  "id" : "8A2C3761-FFD5-4770-9B8C-38C33CED300A",
  "rev" : "1-d3a8e0e5aa7c8fff0c376dac2d8a4007"
}
{% endhighlight %}

**Put vs. post**: The basic rule of thumb is: `put()` new documents with an `_id`, `post()` new documents without an `_id`.

You should also prefer `put()` to `post()`, because when you `post()`, you are missing an opportunity to use `allDocs()` to sort documents by `_id` (because your `_id`s are random). For more info, read the [PouchDB pro tips](/2014/06/17/12-pro-tips-for-better-code-with-pouchdb.html).
