创建索引
索引支持在 MongoDB 中高效执行查询。要在一个或多个字段上创建索引,请将索引规范文档传递给 MongoCollection.createIndex()
方法。
Java Reactive Streams 驱动程序提供Indexes
类,其中包含静态工厂方法,用于为各种 MongoDB 索引键类型创建索引规范文档。 要了解有关索引类型的更多信息,请参阅 MongoDB Server手册中的 索引 。
注意
仅当尚不存在相同规范的索引时,MongoDB 才会创建索引。
先决条件
您必须在程序中包含以下 import 语句才能运行本指南中的代码示例:
import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.reactivestreams.client.MongoCollection; import org.bson.Document; import com.mongodb.client.model.Indexes; import com.mongodb.client.model.IndexOptions; import com.mongodb.client.model.Filters;
重要
本指南使用Subscriber
实现,如快速入门入门知识中所述。
连接到 MongoDB 部署
首先,连接到 MongoDB 部署,然后声明并定义MongoDatabase
和MongoCollection
实例。
以下代码连接到在端口27017
上的localhost
上运行的独立 MongoDB 部署。 然后,定义database
变量以引用test
数据库,并collection
变量以引用restaurants
集合:
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
要了解有关连接到 MongoDB 部署的更多信息,请参阅连接到 MongoDB教程。
升序索引
要创建升序索引规范,请使用Indexes.ascending()
静态辅助方法。
单个升序索引
以下示例在name
字段上创建一个升序索引:
collection.createIndex(Indexes.ascending("name")) .subscribe(new PrintToStringSubscriber<String>());
复合升序索引
以下示例在stars
字段和name
字段上创建一个升序复合索引:
collection.createIndex(Indexes.ascending("stars", "name")) .subscribe(new PrintToStringSubscriber<String>());
要查看创建复合索引的替代方法,请参阅“复合索引”部分。
降序索引
要创建降序索引规范,请使用Indexes.descending()
静态辅助方法。
单个降序键索引
以下示例在stars
字段上创建一个降序索引:
collection.createIndex(Indexes.descending("stars")) .subscribe(new PrintToStringSubscriber<String>());
复合降序键索引
以下示例在stars
字段和name
字段上创建一个降序复合索引:
collection.createIndex(Indexes.descending("stars", "name")) .subscribe(new PrintToStringSubscriber<String>());
要查看创建复合索引的替代方法,请参阅“复合索引”部分。
复合索引
要为复合索引创建规范,请使用Indexes.compoundIndex()
静态辅助方法。
注意
要创建所有键均升序的复合索引规范,可以使用ascending()
方法。要创建所有键均为降序的复合索引规范,可以使用descending()
方法。
以下示例按降序对stars
字段创建复合索引,并按升序对name
字段创建复合索引:
collection.createIndex( Indexes.compoundIndex(Indexes.descending("stars"), Indexes.ascending("name")) ).subscribe(new PrintToStringSubscriber<String>());
文本索引
MongoDB提供文本索引来支持Atlas Search string内容的文本 。文本索引可以包括值为string或string元素数组的任何字段。 要创建文本索引规范,请使用Indexes.text()
静态辅助方法。
以下示例在 name
字段上创建一个文本索引:
collection.createIndex(Indexes.text("name")) .subscribe(new PrintToStringSubscriber<String>());
哈希索引
要为哈希索引创建规范,请使用Indexes.hashed()
静态辅助方法。
以下示例在_id
字段上创建哈希索引:
collection.createIndex(Indexes.hashed("_id")) .subscribe(new PrintToStringSubscriber<String>());
地理空间索引
为了支持地理空间查询,MongoDB 支持各种地理空间索引。
2dsphere
要为2dsphere
索引创建规范,请使用Indexes.geo2dsphere()
静态辅助方法。
以下示例在 contact.location
字段上创建一个 2dsphere
索引:
collection.createIndex(Indexes.geo2dsphere("contact.location")) .subscribe(new PrintToStringSubscriber<String>());
索引选项
除了索引规范文档之外, createIndex()
方法还可以采用索引选项文档,该文档指示驱动程序创建唯一索引或部分索引。
驱动程序提供IndexOptions
类来指定各种索引选项。
将以下导入声明添加到代码中以创建IndexOptions
实例。
import com.mongodb.client.model.IndexOptions;
唯一索引
以下代码指定unique(true)
选项以在name
和stars
字段上创建唯一索引:
IndexOptions indexOptions = new IndexOptions().unique(true); collection.createIndex(Indexes.ascending("name", "stars"), indexOptions) .subscribe(new PrintToStringSubscriber<String>());
部分索引
要创建部分索引,请包含partialFilterExpression
索引选项。
以下示例对status
字段的值为"A"
的文档创建部分索引。
IndexOptions partialFilterIndexOptions = new IndexOptions() .partialFilterExpression(Filters.exists("contact.email")); collection.createIndex( Indexes.descending("name", "stars"), partialFilterIndexOptions) .subscribe(new PrintToStringSubscriber<String>());
获取集合上的索引列表
使用listIndexes()
方法获取索引列表。 以下代码列出了集合上的索引:
collection.listIndexes().subscribe(new PrintDocumentSubscriber());
要了解其他索引选项,请参阅服务器手册中的索引属性。