创建索引
索引支持 MongoDB 中查询的高效执行。要在字段或字段上创建索引,请将索引规范文档传递给MongoCollection.createIndex()
方法。
Java 反应式流驱动程序提供了包含用于创建各种 MongoDB 索引键类型索引规范文档的静态工厂方法的 Indexes
类。有关索引类型的更多信息,请参阅服务器手册中的索引。
注意
MongoDB 仅在不存在相同规范的同索引时才创建索引。
先决条件
您必须在程序中包含以下导入语句,才能运行本指南中的代码示例
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
实例。
以下代码连接到在 localhost
的端口 27017
上运行的独立 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提供了文本索引来支持对字符串内容的文本搜索。文本索引可以包括任何值为字符串或字符串元素数组的字段。要创建文本索引的规范,请使用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>());
IndexOptions
除了索引规范文档之外,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());
了解其他索引选项,请参阅服务器手册中的 索引属性。