计算文档数
概述
在本指南中,您可以学习如何检索集合中文档数量的精确和估算计数。
示例数据
本指南中的示例使用的是sample_restaurants.restaurants
集合,来自Atlas 示例数据集。要了解如何创建免费的 MongoDB Atlas 集群并加载示例数据集,请参阅入门.
重要
项目 Reactor 库
本指南使用 Project Reactor 库来消费由 Java 反应式流驱动方法返回的 Publisher
实例。要了解 Project Reactor 库及其使用方法,请参阅 Reactor 文档中的 入门。要了解本指南中如何使用 Project Reactor 库的方法,请参阅 写入 MongoDB 数据 指南。
获取精确计数
使用 countDocuments()
方法来计算集合中的文档数量。要计算匹配特定搜索条件的文档数量,将查询过滤器传递给 countDocuments()
方法。
要了解如何指定查询,请参阅 指定查询。
统计所有文档
要返回集合中所有文档的数量,请调用 countDocuments()
方法,不传递任何参数,如下例所示
Publisher<Long> countPublisher = restaurants.countDocuments(); Mono.from(countPublisher).doOnNext(System.out::println).blockLast();
统计特定文档
要返回匹配特定搜索条件的文档数量,请在 countDocuments()
方法中指定查询,如下例所示。有关如何指定查询的更多信息,请参阅 指定查询 指南。
Publisher<Long> countPublisher = restaurants.countDocuments( eq("cuisine", "Italian")); Mono.from(countPublisher) .doOnNext(System.out::println) .blockLast();
自定义统计行为
您可以通过向方法传递可选参数来修改 countDocuments()
方法的行为。CountOptions
类提供了修改 countDocuments()
方法行为的方法。要使用 CountOptions
类,构造一个新的类实例,然后调用一个或多个其方法以修改计数操作。您可以将这些方法调用链式连接起来。
要修改计数操作的行为,将类实例和链式方法调用作为最后一个参数传递给 countDocuments()
方法。
以下表格描述了《CountOptions》类中的方法
方法 | 描述 |
---|---|
collation(Collation collation) | 指定排序结果时使用的语言排序类型。有关更多信息,请参阅MongoDB服务器手册中的排序。 |
comment(BsonValue comment) | 将 BsonValue 注释附加到操作。有关更多信息,请参阅MongoDB服务器手册中的插入命令字段指南。 |
comment(String comment) | 将 String 注释附加到操作。有关更多信息,请参阅MongoDB服务器手册中的插入命令字段指南。 |
hint(Bson hint) | 将操作索引设置为 Bson 值。有关更多信息,请参阅MongoDB服务器手册中的提示语句。 |
hintString(String hint) | 将操作索引设置为 String 值。有关更多信息,请参阅MongoDB服务器手册中的提示语句。 |
limit(int limit) | 设置游标返回的最大文档数限制。有关更多信息,请参阅MongoDB服务器文档中的游标。 |
MaxTime(long maxTime, TimeUnit timeUnit) | 设置服务器上操作的最多执行时间。如果操作在时间限制之前未完成,则驱动程序终止操作。 |
skip(int skip) | 设置查询在返回结果之前跳过的文档数。有关更多信息,请参阅MongoDB服务器手册中的skip。 |
修改计数示例
以下代码使用countDocuments()
方法来计算具有cuisine
值为"Italian"
的restaurants
集合中的所有文档。它还将注释"Count all Italian restaurants"
作为String
附加到操作中。
Publisher<Long> countPublisher = restaurants.countDocuments( eq("cuisine", "Italian"), new CountOptions().comment("Count all Italian restaurants")); Mono.from(countPublisher) .doOnNext(System.out::println) .blockLast();
检索估算数量
您可以通过调用 estimatedDocumentCount()
方法来获取集合中文档数量的估算值。该方法根据集合元数据估计文档数量,可能比执行精确计数更快。
以下示例估计集合中文档的数量
Publisher<Long> countPublisher = restaurants.estimatedDocumentCount(); Mono.from(countPublisher) .doOnNext(System.out::println) .blockLast();
自定义估算数量行为
您可以通过向方法传递可选参数来修改 estimatedDocumentCount()
方法的行为。EstimatedDocumentCountOptions
类提供了修改 estimatedDocumentCount()
方法行为的方法。要使用 EstimatedDocumentCountOptions
类,创建该类的新实例,然后调用一个或多个其方法来修改计数操作。您可以链接这些方法调用。
要修改计数操作的行为,将类实例和链接的方法调用作为唯一参数传递给 estimatedDocumentCount()
方法。
以下表格描述了您可以设置的选项以自定义 estimatedDocumentCount()
修改估算数量示例
以下代码使用estimatedDocumentCount()
方法来估算restaurants
集合中的文档数量。它还将“所有文档的估计数量”作为String
附加到操作中。
Publisher<Long> countPublisher = restaurants.estimatedDocumentCount( new EstimatedDocumentCountOptions() .comment("Estimated count of all documents")); Mono.from(countPublisher) .doOnNext(System.out::println) .blockLast();
API 文档
要了解更多关于本指南中讨论的任何方法或类型,请参阅以下API文档