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

指定查询

在此页面上

  • Overview
  • 样本数据
  • 精确匹配
  • 比较操作符。
  • 逻辑操作符
  • 数组操作符
  • 元素操作符
  • 评估操作符
  • 更多信息
  • API 文档

在本指南中,您可以学习;了解如何使用Java Reactive Streams驾驶员指定查询。

重要

项目 Reactor 库

本指南使用 Project ReactorPublisher 库来使用Java Reactive Streams驾驶员方法返回的 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的 入门 。要详细学习;了解如何使用本指南中的 Project Reactor 库方法,请参阅 将数据写入MongoDB指南。

本指南使用的Flux Publisher是 Project Reactor 库中的Publisher实施。 在Java Reactive Streams 中,您必须使用Publisher实现来控制数据在应用程序中的传输方式。 要学习;了解有关Flux 类的更多信息,请参阅 Flux 在 Project Reactor 文档中。

您可以通过创建查询筛选器来优化查询返回的文档集。 查询筛选器是一个表达式,用于指定Atlas Search MongoDB在读取或写入操作中用于匹配文档的 条件。在查询筛选器中,您可以提示驱动程序Atlas Search与您的查询完全匹配的文档,或者您可以组合查询筛选器以Express更复杂的匹配条件。

本指南中的示例对名为fruits的集合运行操作,该集合包含以下文档:

{ "_id": 1, "name": "apples", "qty": 5, "rating": 3, "color": "red", "type": ["fuji", "honeycrisp"] },
{ "_id": 2, "name": "bananas", "qty": 7, "rating": 4, "color": "yellow", "type": ["cavendish"] },
{ "_id": 3, "name": "oranges", "qty": 6, "rating": 2, "type": ["naval", "mandarin"] },
{ "_id": 4, "name": "pineapple", "qty": 3, "rating": 5, "color": "yellow" },

以下代码示例展示了如何创建数据库和集合,然后将样本文档插入集合:

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerApi;
import com.mongodb.ServerApiVersion;
import com.mongodb.client.result.InsertManyResult;
import org.bson.Document;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Mono;
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 java.util.Arrays;
import java.util.List;
public class QueryDatabase {
public static void main(String[] args) {
// Replace the placeholder with your Atlas connection string
String uri = "<connection string>";
// Construct a ServerApi instance using the ServerApi.builder() method
ServerApi serverApi = ServerApi.builder()
.version(ServerApiVersion.V1)
.build();
MongoClientSettings settings = MongoClientSettings.builder()
.applyConnectionString(new ConnectionString(uri))
.serverApi(serverApi)
.build();
// Create a new client and connect to the server
try (MongoClient mongoClient = MongoClients.create(settings)) {
MongoDatabase database = mongoClient.getDatabase("sample_fruits");
MongoCollection<Document> fruits = database.getCollection("fruits");
Document document1 = new Document("_id", "1")
.append("name", "apples")
.append("qty", 5)
.append("rating", 3)
.append("color", "red")
.append("type", Arrays.asList("fuji", "honeycrisp"));
Document document2 = new Document("_id", "2")
.append("name", "bananas")
.append("qty", 7)
.append("rating", 4)
.append("color", "yellow")
.append("type", Arrays.asList("cavendish"));
Document document3 = new Document("_id", "3")
.append("name", "oranges")
.append("qty", 6)
.append("rating", 2)
.append("type", Arrays.asList("naval", "mandarin"));
Document document4 = new Document("_id", "4")
.append("name", "pineapple")
.append("qty", 3)
.append("rating", 5)
.append("color", "yellow");
List<Document> documents = Arrays.asList(document1, document2, document3, document4);
Publisher<InsertManyResult> insertPublisher = fruits.insertMany(documents);
Mono.from(insertPublisher).block();
}
}
}

字面值查询返回与查询过滤精确匹配的文档。 要返回完全匹配的文档,请使用eq()比较操作符方法。

以下示例将eq()比较操作符方法指定为find()方法中的查询过滤参数。 该代码返回color字段值为"yellow"的所有文档。

FindPublisher<Document> findDocPublisher = fruits.find(eq("color", "yellow"));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

提示

查找所有文档

要查找集合中的所有文档,请调用find()方法而不指定任何参数。 以下示例查找集合中的所有文档:

FindPublisher<Document> findDocPublisher = fruits.find();
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();

比较操作符会根据查询过滤中的指定值评估文档字段值。 以下是常见比较操作符方法的列表:

  • gt():大于

  • lte():小于或等于

  • ne():不等于

要查看比较操作符的完整列表,请参阅 MongoDB Server 手册中的比较查询操作符指南。

以下示例将查询过滤中的gt()操作符方法指定为find()方法的参数。 此代码会返回rating字段值大于2的所有文档。

FindPublisher<Document> findDocPublisher = fruits.find(gt("rating", 2));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

逻辑操作符通过使用应用于两组或多组表达式结果的逻辑来匹配文档。 以下是逻辑操作符方法的列表:

  • and(),返回符合所有子句条件的所有文档

  • or(),返回符合一个子句条件的所有文档

  • nor(),返回所有符合任一子句条件的文档

  • not(),它会返回与表达式匹配的所有文档

要了解有关逻辑操作符的更多信息,请参阅 MongoDB Server 手册中的逻辑查询操作符指南。

以下示例将查询过滤中的or()逻辑操作符方法指定为find()方法的参数。 此代码会返回qty字段值大于5color字段值为"yellow"的所有文档。

FindPublisher<Document> findDocPublisher = fruits.find(
or(gt("qty", 5), eq("color", "yellow")));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']}
{'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

数组操作符根据大量字段中元素的值或数量来匹配文档。 以下是可用的大量操作符方法的列表:

  • all(),它会返回带有数组的文档,而该数组包含查询中的所有元素

  • elemMatch(),如果数组字段中的元素与查询中的所有条件匹配,则返回文档

  • size(),返回包含指定大小数组的所有文档

要了解有关数组操作符的更多信息,请参阅 MongoDB Server 手册中的数组查询操作符指南。

以下示例将查询过滤中的size()大量操作符方法指定为find()方法的参数。 该代码返回具有包含2元素的type大量字段的所有文档。

FindPublisher<Document> findDocPublisher = fruits.find(size("type", 2));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 3, 'name': 'oranges', 'qty': 6, 'rating': 2, 'type': ['naval', 'mandarin']}

元素操作符根据字段的存在或类型查询数据。 以下是可用元素操作符方法的列表:

  • exists(),返回具有指定字段的文档

  • type(),如果字段属于指定类型,则返回文档

要了解有关元素操作符的更多信息,请参阅 MongoDB Server 手册中的元素查询操作符指南。

以下示例将查询过滤中的exists()元素操作符方法指定为find()方法的参数。 该代码返回所有具有color字段的文档。

FindPublisher<Document> findDocPublisher = fruits.find(exists("color", true));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 2, 'name': 'bananas', 'qty': 7, 'rating': 4, 'color': 'yellow', 'type': ['cavendish']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

评估操作符根据单个字段或整个集合文档的评估返回数据。 以下是常见评估操作符方法的列表:

  • text(),对文档执行文本Atlas Search

  • regex(),返回与指定正则表达式匹配的文档

  • mod(),它执行 模数 对字段值进行运算,并返回余数为指定值的文档

要查看评估操作符的完整列表,请参阅 MongoDB Server 手册中的评估查询操作符指南。

以下示例将查询过滤中的regex()评估操作符方法指定为find()方法的参数。 该代码使用正则表达式返回name字段值至少有两个连续"p"字符的所有文档。

FindPublisher<Document> findDocPublisher = fruits.find(regex("name", "p{2,}"));
Document findResults = Flux.from(findDocPublisher)
.doOnNext(System.out::println)
.blockLast();
{'_id': 1, 'name': 'apples', 'qty': 5, 'rating': 3, 'color': 'red', 'type': ['fuji', 'honeycrisp']}
{'_id': 4, 'name': 'pineapple', 'qty': 3, 'rating': 5, 'color': 'yellow'}

要了解有关查询文档的更多信息,请参阅 MongoDB Server 手册中的查询文档指南。

要进一步了解本指南所讨论的任何方法或类型,请参阅以下 API 文档:

后退

读取数据