对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

检索不同字段值

在集合中,不同文档的单个字段可能包含不同值。示例,restaurant集合中一个文档的borough 值为 "Manhattan",而另一文档的 borough 值为 "Queens"。借助Java Reactive Streams驱动程序,您可以检索集合中多个文档中某个字段包含的所有不同值。

本指南中的示例使用Atlas示例数据集中sample_restaurants.restaurants集合。 要学习;了解如何创建免费的MongoDB Atlas 群集并加载示例数据集,请参阅入门。

重要

项目 Reactor 库

本指南使用 Project Reactor 库来使用Java Reactive Streams驱动程序方法返回的 Publisher 实例。要学习;了解有关 Project Reactor 库及其使用方法的更多信息,请参阅 Reactor 文档中的入门。要进一步学习;了解如何使用本指南中的 Project Reactor 库方法,请参阅“将数据写入MongoDB”指南。

要检索指定字段的非重复值,请调用distinct()方法并传入要查找非重复值的字段的名称。

以下示例检索restaurants集合中borough字段的非重复值:

DistinctPublisher<String> distinctPublisher = collection
.distinct("borough", String.class);
Flux.from(distinctPublisher)
.doOnNext(System.out::println)
.blockLast();
Bronx
Brooklyn
Manhattan
Missing
Queens
Staten Island

结果显示集合中所有文档的borough字段中出现的每个不同值。 尽管多个文档在borough字段中具有相同的值,但每个值仅在结果中出现一次。

您可以为distinct()方法提供查询筛选器,以查找集合中文档子集的不同字段值。 查询筛选器是一个表达式,指定Atlas Search用于匹配操作中的文档的条件。 有关创建查询筛选器的更多信息,请参阅指定查询。

以下示例检索cuisine字段值为"Italian"的所有文档的borough字段的非重复值:

Bson filter = Filters.eq("cuisine", "Italian");
DistinctPublisher<String> distinctPublisher = collection
.distinct("borough", String.class)
.filter(filter);
Flux.from(distinctPublisher)
.doOnNext(System.out::println)
.blockLast();
Bronx
Brooklyn
Manhattan
Queens
Staten Island

可以通过将方法链接到 distinct() 方法调用来修改 distinct() 方法。如果不指定任何选项,驱动程序不会自定义操作。

下表描述了可用于自定义distinct()操作的一些方法:

方法
说明

batchSize()

设置批处理返回的文档数。默认下,驾驶员会将此值设置为 Long.MAX_VALUE

batchSize0 表示将建立游标,但第批处理不会返回任何文档。

collation()

指定对结果进行排序时要使用的语言排序规则类型。 有关更多信息,请参阅 MongoDB Server 手册中的排序规则

comment()

指定要附加到操作的注释。

filter()

设置要应用于查询的查询筛选器。

有关可用于修改 distinct() 方法的方法的完整列表,请参阅 DistinctPublisher API文档。

以下示例检索borough字段值为"Bronx"cuisine字段值为"Pizza"的所有文档的name字段的非重复值。 它还使用comment选项为操作添加注释。

Bson filter = Filters.and(
Filters.eq("borough", "Bronx"),
Filters.eq("cuisine", "Pizza")
);
DistinctPublisher<String> distinctPublisher = collection
.distinct("name", String.class)
.filter(filter)
.comment("Bronx pizza restaurants");
Flux.from(distinctPublisher)
.doOnNext(System.out::println)
.blockLast();
$1.25 Pizza
18 East Gunhill Pizza
2 Bros
Aenos Pizza
Alitalia Pizza Restaurant
...

要学习;了解有关 distinct 命令的更多信息,请参阅MongoDB Server手册中的Distinct指南

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