NewDocumentDB 1.0 is here. See what's new
MQL reference navigation

createIndexes

Creates one or more indexes.

The examples use the airline dataset. The vector example indexes each flight's three-element route_vector and requires HNSW support.

db.flights.createIndex({ route_no: 1 })

Parameters

ParameterDescription
createIndexes(Required) A string specifying the collection name.
indexes(Required) An array of documents specifying the index specifications.
ignoreUnknownIndexOptions(Optional) A boolean-like value that ignores unknown index-specification options instead of rejecting them; defaults to false. Does not allow arbitrary command-level fields.
blocking(Optional) A boolean-like value provided as a DocumentDB extension requesting blocking index creation; defaults to false.
skipWaitForIndex(Optional) A boolean-like value provided as a DocumentDB extension for submitting background builds without the usual wait, where supported by the build path.
maxTimeMS(Optional) A number that limits gateway waiting for a background index build. A timeout does not imply the submitted build was cancelled.
comment(Optional) A string carrying trace context for gateway request tracing; see common request fields.

Index specification

ParameterDescription
key(Required) A document specifying the indexed paths and index kinds, such as 1, -1, "text", "2d", "2dsphere", or "cosmosSearch".
name(Required on the wire) A string specifying the index name. Optional when using the shell's createIndex() helper.
unique(Optional) A boolean-like value that enforces unique indexed values.
partialFilterExpression(Optional) A document that indexes only documents matching this filter.
sparse(Optional) A boolean-like value specifying the sparse-index behavior, subject to supported index combinations.
wildcardProjection(Optional) A document specifying the included or excluded paths for a wildcard index.
v(Optional) An integer specifying the index specification version; unsupported versions are rejected.
expireAfterSeconds(Optional) A non-negative number specifying the TTL interval within the supported 32-bit range.
default_language(Optional) A string specifying the default text-index language.
language_override(Optional) A string specifying the document field selecting the text-index language.
weights(Optional) A document or "$**" specifying the text-index field weights or wildcard weights.
textIndexVersion(Optional) A number specifying the text-index version; validated when a new index must actually be built.
cosmosSearchOptions(Optional) A document specifying the vector index options, described below.
min(Optional) A number specifying the bounds for a 2d index.
max(Optional) A number specifying the bounds for a 2d index.
bits(Optional) An integer specifying 2d precision, from 1 through 32.
collation(Optional) A document specifying the non-empty comparison rules; requires collation support.
prepareUnique(Optional) A boolean that is recognized only by the prepare-unique creation path; not a generally available creation option.
storageEngine(Optional) A document containing the DocumentDB-specific options below, not a choice of PostgreSQL storage engine.

DocumentDB-specific index options

These are accepted directly in an index specification or inside storageEngine:

ParameterDescription
buildAsUnique(Optional) A boolean-like value that builds an index for the staged unique-index conversion workflow, without declaring it unique.
blocking(Optional) A boolean-like value requesting a blocking build for this index. storageEngine.blocking mirrors the top-level command's blocking option.

Regular and composite indexes

Both examples use the default ordered/composite index format without explicitly selecting it.

Regular index: Create a single-field index for arrival-airport lookups:

db.flights.createIndex(
  { arrival_airport: 1 },
  { name: "arrival_airport_1" }
)

db.flights.find({ arrival_airport: "LED" })

Composite (ordered) index: Index the departure airport followed by scheduled departure time, for queries that filter by airport and sort by departure time:

db.flights.createIndex(
  { departure_airport: 1, scheduled_departure: 1 },
  { name: "departure_airport_1_scheduled_departure_1" }
)

db.flights.find({ departure_airport: "SVO" }).sort({ scheduled_departure: 1 })

An ordered/composite index can also have a single field. The key document specifies the indexed fields and their order.

Unique, blocking, and TTL indexes

Unique index: Enforce uniqueness of the combination of route number and scheduled departure. Existing documents must already satisfy the constraint.

db.flights.createIndex(
  { route_no: 1, scheduled_departure: 1 },
  { name: "route_no_1_scheduled_departure_1_unique", unique: true }
)

Blocking index: Request a blocking build for this index through storageEngine.blocking. A blocking build can block writes to the collection while it runs.

db.flights.createIndex(
  { departure_airport: 1 },
  {
    name: "departure_airport_1_blocking",
    storageEngine: { blocking: true }
  }
)

TTL index: An application can keep short-lived flight events in a separate flight_events collection. Store recorded_at as a BSON date and expire events 24 hours after that timestamp:

db.flight_events.insertOne({
  flight_id: 101,
  event: "check_in_opened",
  recorded_at: new Date()
})

db.flight_events.createIndex(
  { recorded_at: 1 },
  { name: "recorded_at_ttl", expireAfterSeconds: 86400 }
)

TTL indexes must be single-field indexes and cannot target _id. Deletion happens asynchronously through TTL cleanup, not exactly at the expiration timestamp.

Vector index options

ParameterDescription
kind(Required) A string specifying the index kind. Built-in kinds are "vector-ivf" and "vector-hnsw"; HNSW requires its server capability to be enabled.
similarity(Required) A string selecting "COS", "L2", or "IP".
dimensions(Required) A number specifying the vector dimension count, greater than 1, within the implementation's dimension limits.
compression(Optional) A string selecting the compression mode. "half" requires half-vector support and its feature gate.
numLists(Optional) A number specifying the IVF list count, within the implementation's supported range.
m(Optional) A number specifying the HNSW graph connectivity, within its supported range.
efConstruction(Optional) A number specifying the HNSW construction search width, within its supported range.

Other vector implementations can register additional kinds and options; those are not part of the default built-in wire surface.

db.flights.createIndex(
  { route_vector: "cosmosSearch" },
  {
    name: "route_vector_index",
    cosmosSearchOptions: {
      kind: "vector-hnsw",
      similarity: "COS",
      dimensions: 3,
      m: 16,
      efConstruction: 64
    }
  }
)

Text index representations

Text indexes support two representations. The following examples describe the same text index over the flight's departure and arrival airport fields; choose one representation rather than creating two indexes.

Field-name representation: Set each indexed field to "text" in the key document. Fields have weight 1 unless overridden with weights.

db.flights.createIndex(
  { departure_airport: "text", arrival_airport: "text" },
  { name: "flight_airports_text" }
)

Metadata representation: Use { _fts: "text", _ftsx: 1 } as the key document and identify the actual indexed fields and their weights in weights. _fts and _ftsx are index metadata markers, not fields you need to add to your documents. This is also the key representation used in listIndexes output.

db.flights.createIndex(
  { _fts: "text", _ftsx: 1 },
  {
    name: "flight_airports_text",
    weights: { departure_airport: 1, arrival_airport: 1 }
  }
)

For a wildcard text index, use { "$**": "text" } in the field-name representation, or the metadata key document with weights: { "$**": 1 }.

Build a unique index on existing data

Use this staged workflow to add uniqueness to a collection that already contains documents. It requires prepare-unique and unique-conversion support to be enabled in the deployment. The example is an alternative to the direct unique: true example above; start without that index already created.

1. Build the index for uniqueness conversion

Create the index with storageEngine.buildAsUnique: true, without setting unique: true. Wait for index creation to complete before proceeding. An ordinary non-unique index created without buildAsUnique is not eligible for this workflow.

db.flights.createIndex(
  { route_no: 1, scheduled_departure: 1 },
  {
    name: "route_no_1_scheduled_departure_1_unique",
    storageEngine: { buildAsUnique: true }
  }
)

2. Prevent new duplicate keys

Use collMod to set prepareUnique: true. This starts rejecting writes that would introduce duplicate index keys; it does not resolve existing duplicates. Correct any existing duplicate combinations of route number and scheduled departure before the next step.

db.runCommand({
  collMod: "flights",
  index: {
    name: "route_no_1_scheduled_departure_1_unique",
    prepareUnique: true
  }
})

3. Validate existing data and convert

Set unique: true in a separate collMod request. This validates existing indexed data and, if validation succeeds, converts the index to a unique index. If duplicate keys remain, conversion fails; correct the conflicting data and retry this step.

db.runCommand({
  collMod: "flights",
  index: {
    name: "route_no_1_scheduled_departure_1_unique",
    unique: true
  }
})

Do not combine prepareUnique and unique in the same request. After successful conversion, the index is reported as unique and enforces uniqueness for the indexed key combination.

Appendix: Ordered-index option

Ordered/composite indexing is enabled by default, so normal index creation does not require enableOrderedIndex. When needed, the option is accepted directly in an index specification or inside storageEngine.

ParameterDescription
enableOrderedIndex(Optional) A boolean or integer controlling ordered/composite indexing. Numeric values must be -1, 1, or 2; booleans are preferred.

See wire protocol and common fields. Source: pg_documentdb/src/commands/create_indexes.c, ParseCreateIndexesArg, ParseIndexDefDoc, ParseCustomIndexDefOption, and pg_documentdb/src/vector/vector_index_kind_impl.c; uniqueness conversion: pg_documentdb/src/commands/coll_mod.c, HandleUniqueConversion and UpdatePostgresIndexesForUnique.