{% include anchor.html edit="true" title="Create index" hash="create_index" %}

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

Create an index if it doesn't exist, or do nothing if it already exists.

{% 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="create_idx" type="callback" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo']
  }
}, function (err, result) {
  if (err) { return console.log(err); }
  // handle result
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx" type="async" %}
{% highlight js %}
try {
  var result = await db.createIndex({
    index: {
      fields: ['foo']
    }
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx" type="promise" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo']
  }
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

#### Example Response:

If the index was created, you'll see:

{% highlight js %}
{ "result": "created" }
{% endhighlight %}

Or if the index already exists:

{% highlight js %}
{ "result": "exists" }
{% endhighlight %}

You can also create an index on multiple fields:

{% include code/start.html id="create_idx2" type="callback" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo', 'bar', 'baz']
  }
}, function (err, result) {
  if (err) { return console.log(err); }
  // handle result
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx2" type="async" %}
{% highlight js %}
try {
  var result = await db.createIndex({
    index: {
      fields: ['foo', 'bar', 'baz']
    }
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx2" type="promise" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo', 'bar', 'baz']
  }
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

Or an index on deep fields:

{% include code/start.html id="create_idx3" type="callback" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['person.address.zipcode']
  }
}, function (err, result) {
  if (err) { return console.log(err); }
  // handle result
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx3" type="async" %}
{% highlight js %}
try {
  var result = await db.createIndex({
    index: {
      fields: ['person.address.zipcode']
    }
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx3" type="promise" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['person.address.zipcode']
  }
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

You can also specify additional options, if you want more control over how your index is created:

{% include code/start.html id="create_idx4" type="callback" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo', 'bar'],
    name: 'myindex',
    ddoc: 'mydesigndoc',
    type: 'json',
  }
}, function (err, result) {
  if (err) { return console.log(err); }
  // handle result
});
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx4" type="async" %}
{% highlight js %}
try {
  var result = await db.createIndex({
    index: {
      fields: ['foo', 'bar'],
      name: 'myindex',
      ddoc: 'mydesigndoc',
      type: 'json',
    }
  });
} catch (err) {
  console.log(err);
}
{% endhighlight %}
{% include code/end.html %}

{% include code/start.html id="create_idx4" type="promise" %}
{% highlight js %}
db.createIndex({
  index: {
    fields: ['foo', 'bar'],
    name: 'myindex',
    ddoc: 'mydesigndoc'
    type: 'json',
  }
}).then(function (result) {
  // handle result
}).catch(function (err) {
  console.log(err);
});
{% endhighlight %}
{% include code/end.html %}

### Options

* `fields`: a list of fields to index
* `name` (optional): name of the index, auto-generated if you don't include it
* `ddoc` (optional): design document name (i.e. the part after `'_design/'`), auto-generated if you don't include it
* `type` (optional): only supports `'json'`, which is also the default
