- MongoDB Async Driver
- Tutorials
- Create Indexes
Create Indexes
Indexes support the efficient execution of queries in MongoDB. To create an index on a field or fields, pass an index specification document to the MongoCollection.createIndex method.
The MongoDB Java Async Driver provides the Indexes helper class that
provides static factory methods to create index specification
documents for the various MongoDB Index key types.
Note
MongoDB only creates an index if an index of the same specification does not already exist.
Consideration
important
Always check for errors in any SingleResultCallback<T> implementation
and handle them appropriately.
For sake of brevity, this tutorial omits the error check logic in the code examples.
Prerequisites
- Include the following import statements: - import com.mongodb.Block; import com.mongodb.async.SingleResultCallback; import com.mongodb.async.client.MongoClient; import com.mongodb.async.client.MongoClients; import com.mongodb.async.client.MongoCollection; import com.mongodb.async.client.MongoDatabase; import com.mongodb.client.model.*; import org.bson.Document;
- Include the following callback code which the examples in the tutorials will use: - SingleResultCallback<String> callbackWhenFinished = new SingleResultCallback<String>() { @Override public void onResult(final String result, final Throwable t) { System.out.println("Operation Finished!"); } };
Connect to a MongoDB Deployment
Connect to a MongoDB deployment and declare and define a MongoDatabase and a MongoCollection instances.
For example, include the following code to connect to a standalone MongoDB deployment running on localhost on port 27017 and define database to refer to the test database and collection to refer to the restaurants collection:
MongoClient mongoClient = MongoClients.create();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("restaurants");
For additional information on connecting to MongoDB, see Connect to MongoDB.
Ascending Index
To create a specification for an ascending index, use the Indexes.ascending static helper methods.
Single Ascending Index
The following example creates an ascending index on the
name field:
collection.createIndex(Indexes.ascending("name"), callbackWhenFinished);
Compound Ascending Index
The following example creates an ascending compound index  on the stars field and the name
 field:
collection.createIndex(Indexes.ascending("stars", "name"), callbackWhenFinished);
For an alternative way to create a compound index, see Compound Indexes.
Descending Index
To create a specification of a descending index, use the Indexes.descending static helper methods.
Single Descending Key Index
The following example creates a descending index on the stars field:
collection.createIndex(Indexes.descending("stars"), callbackWhenFinished);
Compound Descending Key Index
The following example creates a descending compound index on the stars field and the name field:
collection.createIndex(Indexes.descending("stars", "name"), callbackWhenFinished);
For an alternative way to create a compound index, see Compound Indexes.
Compound Indexes
To create a specification for a compound index, use the Indexes.compoundIndex static helper methods.
Note
To create a specification for a compound index where all the keys are ascending, you can use the ascending() method. To create a specification for a compound index where all the keys are descending, you can use the descending() method.
The following example creates a compound index with the stars field in descending order and the name field in ascending order:
collection.createIndex(Indexes.compoundIndex(Indexes.descending("stars"),
                       Indexes.ascending("name")), callbackWhenFinished);
Text Indexes
MongoDB provides text indexes to support text search of string content. Text indexes can include any field whose value is a string or an array of string elements. To create a specification for a text index, use the
Indexes.text static helper method.
The following example creates a text index on the name field:
collection.createIndex(Indexes.text("name"), callbackWhenFinished);
Hashed Index
To create a specification for a hashed index index, use the Indexes.hashed static helper method.
The following example creates a hashed index on the _id field:
collection.createIndex(Indexes.hashed("_id"), callbackWhenFinished);
Geospatial Indexes
To support geospatial queries, MongoDB supports various geospatial indexes.
2dsphere
To create a specification for a 2dsphere index, use the Indexes.geo2dsphere static helper methods.
The following example creates a 2dsphere index on the "contact.location" field:
collection.createIndex(Indexes.geo2dsphere("contact.location"), callbackWhenFinished);
2d
To create a specification for a 2d index index, use the Indexes.geo2d
static helper method.
important
A 2d index is for data stored as points on a two-dimensional plane and is intended for legacy coordinate pairs used in MongoDB 2.2 and earlier.
The following example creates a 2d index on the "contact.location" field:
collection.createIndex(Indexes.geo2d("contact.location"), callbackWhenFinished);
geoHaystack
To create a specification for a geoHaystack index, use the Indexes.geoHaystack method. geoHaystack indexes can improve performance on queries that use flat geometries.
The following example creates a geoHaystack index on the contact.location field and an ascending index on the stars field:
IndexOptions haystackOption = new IndexOptions().bucketSize(1.0);
collection.createIndex(
         Indexes.geoHaystack("contact.location", Indexes.ascending("stars")),
         haystackOption, callbackWhenFinished);
To query a haystack index, use the geoSearch command.
IndexOptions
import com.mongodb.client.model.IndexOptions;
In addition to the index specification document, the
createIndex() method can take an index options document, such as to create unique indexes or partial indexes.
The Java Driver provides the IndexOptions class to specify various index options.
Unique Index
The following specifies a unique(true) option to create a unique index on the name and stars fields:
IndexOptions indexOptions = new IndexOptions().unique(true);
collection.createIndex(Indexes.ascending("name", "stars"),
                       indexOptions,
                       callbackWhenFinished);
For more information on unique indexes, see Unique Indexes.
Partial Index
To create a partial index, include a partialFilterExpression as an index option.
The following example creates a partial index on documents that have status field equal to "A".
IndexOptions partialFilterIndexOptions = new IndexOptions()
                       .partialFilterExpression(Filters.exists("contact.email"));
collection.createIndex(Indexes.descending("name", "stars"),
                       partialFilterIndexOptions,
                       callbackWhenFinished);
For more information on partial indexes, see Partial Indexes.
Get a List of Indexes on a Collection
Use the listIndexes() method to get a list of indexes. The following lists the indexes on the collection:
Block<Document> printBlock = new Block<Document>() {
            @Override
            public void apply(final Document document) {
                System.out.println(document.toJson());
            }
        };
collection.listIndexes().forEach(printBlock, new SingleResultCallback<Void>() {
            @Override
            public void onResult(final Void result, final Throwable t) {
                System.out.println("Operation Finished!");
            }
        });
