创建索引
索引支持 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());
了解其他索引选项,请参阅服务器手册中的 索引属性。