计算文档
MongoCollection
类中有两个实例方法,您可以调用它们来计算集合中的文档数量:
countDocuments()
返回collection中与指定查询匹配的文档数量的准确计数。如果指定空的查询筛选器,该方法将返回collection中的文档总数。estimatedDocumentCount()
根据集合元数据返回集合中文档的估计数量。使用此方法时不能指定查询。
estimatedDocumentCount()
方法比countDocuments()
方法的返回速度更快,因为它使用collection的元数据而不是扫描整个collection。countDocuments()
方法返回文档数量的准确计数并支持指定筛选器。
提示
使用countDocuments()
返回集合中的文档总数时,可以通过避免集合扫描来提高性能。 为此,请使用提示以利用_id
字段的内置索引。 仅当使用空查询参数调用countDocuments()
时才使用此技术:
val options = CountOptions().hintString("_id_") val numDocuments = collection.countDocuments(BsonDocument(), options)
调用 countDocuments()
方法时,您可以选择传递查询筛选器参数。您在调用 estimatedDocumentCount()
时不能传递任何参数。
重要
稳定 API V1 和 MongoDB Server 问题
如果您使用的是带有 "strict" 选项的“Stable API V1
”,且 MongoDB 服务器版本介于 5.0.0 和 5.0.8(含)之间,那么对 estimatedDocumentCount()
的方法调用可能会因服务器错误而出错。
升级到 MongoDB Server 5.0.9 或将 Stable API“strict”选项设置为 false
以避免此问题。
您还可以向其中任何一个方法传递可选参数,指定调用行为:
方法 | 可选参数类 | 说明 |
---|---|---|
countDocuments() | CountOptions | 您可以使用 limit() 方法指定要统计的最大文档数量,或使用 maxTime() 方法指定最长执行时间。 |
estimatedDocumentCount() | EstimatedDocumentCountOptions | 您可以使用 maxTime() 方法指定最长执行时间。 |
这两种方法都以 Long
基元返回匹配文档的数量。
例子
以下示例估计 sample_mflix
数据库中 movies
集合中的文档数,然后返回 movies
集合中 countries
字段中包含 Spain
的文档数的准确计数。 如果运行前面的示例代码,您应该会看到类似以下输出(具体数字可能因数据而异):
注意
此示例使用连接 URI 连接到MongoDB实例。 要学习;了解有关连接到MongoDB实例的更多信息,请参阅连接指南。
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking data class Movie(val countries: List<String>) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") val query = Filters.eq(Movie::countries.name, "Spain") try { val estimatedCount = collection.estimatedDocumentCount() println("Estimated number of documents in the movies collection: $estimatedCount") val matchingCount = collection.countDocuments(query) println("Number of movies from Spain: $matchingCount") } catch (e: MongoException) { System.err.println("An error occurred: $e") } mongoClient.close() }
Estimated number of documents in the movies collection: 23541 Number of movies from Spain: 755
有关此页面上提及的类和方法的更多信息,请参阅以下 API 文档: