Docs 菜单
Docs 主页
/ / /
Java Reactive Streams 驱动程序

使用索引优化查询

在此页面上

  • Overview
  • 项目 Reactor 实施
  • 示例应用程序
  • 单字段索引
  • 复合索引
  • Multikey Index
  • 地理空间索引
  • 唯一索引
  • 通配符索引(Wildcard Index)
  • 聚集索引
  • Atlas Search 索引管理
  • 创建Atlas Search索引
  • 搜索索引列表
  • 更新搜索索引
  • 删除Atlas Search索引
  • Text Index
  • 删除索引

在此页面上,您可以查看可复制的代码示例,这些示例展示了如何使用Java Reactive Streams驾驶员管理不同类型的索引。

要使用本页中的示例,请将代码示例复制到示例应用程序或您自己的应用程序中。 请务必将代码示例中的所有占位符(例如 <connection string URI> )替换为 MongoDB 部署的相关值。

本指南使用 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一次,因为订阅多次可能会导致错误。

您可以使用以下示例应用程序来测试本页上的代码示例。 要使用示例应用程序,请执行以下步骤:

  1. 在 IDE 中创建一个新的Java项目。

  2. 在Java项目中安装Java Reactive Streams驾驶员。

  3. 安装 Project Reactor 库 在您的Java项目中。

  4. 复制以下代码并将其粘贴到名为IndexApp.java的新Java文件中。

  5. 从此页面复制代码示例,并将其粘贴到文件中的指定行。

1import com.mongodb.ConnectionString;
2import com.mongodb.MongoClientSettings;
3import com.mongodb.ServerApi;
4import com.mongodb.ServerApiVersion;
5
6import com.mongodb.client.model.ClusteredIndexOptions;
7import com.mongodb.client.model.CreateCollectionOptions;
8import com.mongodb.client.model.IndexOptions;
9import com.mongodb.client.model.Indexes;
10import com.mongodb.reactivestreams.client.*;
11import org.bson.Document;
12import org.reactivestreams.Publisher;
13import reactor.core.publisher.Flux;
14import reactor.core.publisher.Mono;
15
16public 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();

以下示例在指定的数组值字段上创建多键索引:

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();

以下示例在指定集合中创建通配符索引:

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索引:

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索引:

Publisher<Void> publisher = collection.dropIndex("<index name>");
Mono.from(publisher).block();

以下示例在指定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();

后退

监控数据变化