使用索引优化查询
在此页面上
Overview
在此页面上,您可以查看可复制的代码示例,这些示例展示了如何使用Java Reactive Streams驾驶员管理不同类型的索引。
要使用本页中的示例,请将代码示例复制到示例应用程序或您自己的应用程序中。 请务必将代码示例中的所有占位符(例如 <connection string URI>
)替换为 MongoDB 部署的相关值。
项目 Reactor 实施
本指南使用 Project Reactor 库来使用Java Reactive Streams驾驶员方法返回的Publisher
实例。 要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 入门 在 Reactor 文档中。
还有其他方法可以使用Publisher
实例。 您可以使用许多替代库之一,例如 RxJava 或直接调用Publisher.subscribe()
并传递您自己的Subscriber
实施。
本指南使用 Reactor 中的Mono.block()
方法订阅Publisher
并区块当前线程,直到Publisher
达到其终止状态。 要学习;了解有关 Reactive Streams 计划的更多信息,请参阅 Reactive Streams。
重要
返回的发布者处于冷状态
Java Reactive Streams驾驶员方法返回的所有Publisher
实例都是冷实例,这意味着除非您订阅返回的Publisher
,否则不会发生相应的操作。 我们建议仅订阅返回的Publisher
一次,因为订阅多次可能会导致错误。
示例应用程序
您可以使用以下示例应用程序来测试本页上的代码示例。 要使用示例应用程序,请执行以下步骤:
在 IDE 中创建一个新的Java项目。
在Java项目中安装Java Reactive Streams驾驶员。
安装 Project Reactor 库 在您的Java项目中。
复制以下代码并将其粘贴到名为
IndexApp.java
的新Java文件中。从此页面复制代码示例,并将其粘贴到文件中的指定行。
1 import com.mongodb.ConnectionString; 2 import com.mongodb.MongoClientSettings; 3 import com.mongodb.ServerApi; 4 import com.mongodb.ServerApiVersion; 5 6 import com.mongodb.client.model.ClusteredIndexOptions; 7 import com.mongodb.client.model.CreateCollectionOptions; 8 import com.mongodb.client.model.IndexOptions; 9 import com.mongodb.client.model.Indexes; 10 import com.mongodb.reactivestreams.client.*; 11 import org.bson.Document; 12 import org.reactivestreams.Publisher; 13 import reactor.core.publisher.Flux; 14 import reactor.core.publisher.Mono; 15 16 public class IndexApp { 17 public static void main(String[] args) { 18 // Replace the placeholder with your Atlas connection string 19 String uri = "<connection string URI>"; 20 21 // Construct a ServerApi instance using the ServerApi.builder() method 22 ServerApi serverApi = ServerApi.builder() 23 .version(ServerApiVersion.V1) 24 .build(); 25 26 MongoClientSettings settings = MongoClientSettings.builder() 27 .applyConnectionString(new ConnectionString(uri)) 28 .serverApi(serverApi) 29 .build(); 30 31 // Create a new client and connect to the server 32 try (MongoClient mongoClient = MongoClients.create(settings)) { 33 MongoDatabase database = mongoClient.getDatabase("<database name>"); 34 MongoCollection<Document> collection = database.getCollection("<collection name>"); 35 36 // Start example code here 37 38 // End example code here 39 } 40 } 41 }
单字段索引
以下示例在指定字段上创建一个升序索引:
Publisher<String> publisher = collection.createIndex(Indexes.ascending("<field name>")); Mono.from(publisher).block();
复合索引
以下示例在指定字段上创建复合索引:
Publisher<String> publisher = collection.createIndex(Indexes.ascending("<field name 1>", "<field name 2>")); Mono.from(publisher).block();
Multikey Index
以下示例在指定的数组值字段上创建多键索引:
Publisher<String> publisher = collection.createIndex(Indexes.ascending("<array field name>")); Mono.from(publisher).block();
地理空间索引
以下示例对包含GeoJSON对象的指定字段创建2dsphere
索引:
Publisher<String> publisher = collection.createIndex(Indexes.geo2dsphere("<GeoJSON object field>")); Mono.from(publisher).block();
唯一索引
以下示例在指定字段上创建唯一索引:
IndexOptions indexOptions = new IndexOptions().unique(true); Publisher<String> publisher = collection.createIndex(Indexes.ascending("<field name>"), indexOptions); Mono.from(publisher).block();
通配符索引(Wildcard Index)
以下示例在指定集合中创建通配符索引:
Publisher<String> publisher = collection.createIndex(Indexes.ascending("$**")); Mono.from(publisher).block();
聚集索引
以下示例将在_id
字段上创建一个具有集群索引的新集合:
ClusteredIndexOptions clusteredIndexOptions = new ClusteredIndexOptions( Indexes.ascending("_id"), true ); CreateCollectionOptions createCollectionOptions= new CreateCollectionOptions() .clusteredIndexOptions(clusteredIndexOptions); Publisher<Void> clusteredCollection = database.createCollection("<collection name>", createCollectionOptions); Mono.from(clusteredCollection).block();
Atlas Search 索引管理
以下部分包含描述如何管理Atlas Search索引的代码示例。
创建Atlas Search索引
以下示例在指定字段上创建Atlas Search索引:
Document index = new Document("mappings", new Document("dynamic", true)); Publisher<String> publisher = collection.createSearchIndex("<index name>", index); Mono.from(publisher).block();
搜索索引列表
以下示例将打印指定集合中的Atlas Search索引列表:
ListSearchIndexesPublisher<Document> listIndexesPublisher = collection.listSearchIndexes(); Flux.from(listIndexesPublisher) .doOnNext(System.out::println) .blockLast();
更新搜索索引
以下示例使用指定的新索引定义更新现有Atlas Search索引:
Document newIndex = new Document("mappings", new Document("dynamic", true)); Publisher<Void> publisher = collection.updateSearchIndex("<index name>", newIndex); Mono.from(publisher).block();
删除Atlas Search索引
以下示例删除具有指定名称的Atlas Search索引:
Publisher<Void> publisher = collection.dropIndex("<index name>"); Mono.from(publisher).block();
Text Index
以下示例在指定string字段上创建文本索引:
Publisher<String> publisher = collection.createIndex(Indexes.text("<field name>")); Mono.from(publisher).block();
删除索引
以下示例删除具有指定名称的索引:
Publisher<Void> publisher = collection.dropIndex("<index name>"); Mono.from(publisher).block();