ドキュメントをカウント
MongoCollection
クラスには、コレクション内のドキュメント数をカウントするために呼び出しできる 2 つのインスタンス メソッドがあります。
countDocuments()
は、指定されたクエリに一致するコレクション内のドキュメントの数の正確な数を返します。 空のクエリフィルターを指定すると、メソッドはコレクション内のドキュメントの総数を返します。estimatedDocumentCount()
は、コレクションのメタデータに基づいて、コレクション内のドキュメントの数の推定値を返します。 このメソッドを使用する場合、クエリを指定することはできません。
estimatedDocumentCount()
メソッドは、コレクション全体をスキャンするのではなく、コレクションのメタデータを使用するため、 countDocuments()
メソッドよりも速く返します。 countDocuments()
メソッドはドキュメントの数の正確なカウントを返し、フィルターの指定をサポートします。
Tip
countDocuments()
を使用してコレクション内のドキュメントの合計数を返す場合、コレクションスキャンを回避してパフォーマンスを向上できます。 そのためには、 ヒントを使用して_id
フィールドの組み込みインデックスを活用します。 この手法は、空のクエリ パラメータを使用してcountDocuments()
を呼び出す場合にのみ使用します。
val options = CountOptions().hintString("_id_") val numDocuments = collection.countDocuments(BsonDocument(), options)
countDocuments()
メソッドを呼び出すときは、任意でクエリフィルターパラメータを渡すことができます。 estimatedDocumentCount()
を呼び出すときにパラメータを渡すことはできません。
重要
Stable API V1 と MongoDB Server の問題
Stable API V1
を「strict」オプションとともに使用し、かつ MongoDB サーバー バージョン 5.0.0 から 5.0.8 までの場合、サーバーのバグが原因でestimatedDocumentCount()
へのメソッド呼び出しでエラーが発生する可能性があります。
この問題を回避するには、MongoDB サーバー 5.0.9 にアップグレードするか、Stable API の「strict」オプションをfalse
に設定します。
これらのメソッドのいずれかに任意のパラメーターを渡して、呼び出しの動作を指定することもできます。
方式 | 任意のパラメーター クラス | 説明 |
---|---|---|
|
| カウントするドキュメントの最大数を指定するには |
|
|
|
どちらの方法も、一致するドキュメントの数をLong
プリミティブとして返します。
例
次の例では、 sample_mflix
データベース内のmovies
コレクション内のドキュメント数を推定し、 countries
フィールドにSpain
が含まれるmovies
コレクション内のドキュメント数の正確なカウントを返します。 上記のサンプル コードを実行すると、次のような出力が表示されます(正確な数値はデータによって異なる場合があります)。
注意
この例では、接続 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 ドキュメントを参照してください。