ドキュメントをカウント
MongoCollection
クラスには、コレクション内のドキュメント数をカウントするために呼び出しできる 2 つのインスタンス メソッドがあります。
countDocuments()
は、指定されたクエリに一致するコレクション内のドキュメントの数を返します。 空のクエリフィルターを指定すると、メソッドはコレクション内のドキュメントの総数を返します。estimatedDocumentCount()
は、コレクションのメタデータに基づいて、コレクション内のドキュメントの数の推定値を返します。 このメソッドを使用する場合、クエリを指定することはできません。
estimatedDocumentCount()
メソッドは、コレクション全体をスキャンするのではなく、コレクションのメタデータを使用するため、 countDocuments()
メソッドよりも速く返します。 countDocuments()
メソッドはドキュメントの数の正確なカウントを返し、フィルターの指定をサポートします。
Tip
countDocuments()
を使用してコレクション内のドキュメントの合計数を返す場合、コレクションスキャンを回避してパフォーマンスを向上できます。 そのためには、ヒントを使用して_id
フィールドの組み込みインデックスを活用してください。 この手法は、空のクエリ パラメータを使用してcountDocuments()
を呼び出す場合にのみ使用してください。
CountOptions opts = new CountOptions().hintString("_id_"); long numDocuments = collection.countDocuments(new BsonDocument(), opts);
countDocuments()
メソッドを呼び出すときは、任意でクエリフィルターパラメータを渡すことができます。 estimatedDocumentCount()
を呼び出すときにパラメータを渡すことはできません。
重要
Stable API V1 と MongoDB Server の問題
Stable API V1
を「strict」オプションとともに使用し、かつ MongoDB Server バージョン 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
フィールドに Canada
が含まれるドキュメントの正確な数が返されます。
注意
この例では、接続 URI を使用して MongoDB のインスタンスに接続します。 MongoDB インスタンスへの接続の詳細については、「 接続ガイド 」を参照してください。
// Runs count operations on a collection by using the Java driver package usage.examples; import static com.mongodb.client.model.Filters.eq; import org.bson.Document; import org.bson.conversions.Bson; import com.mongodb.MongoException; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; public class CountDocuments { public static void main(String[] args) { // Replace the uri string with your MongoDB deployment's connection string String uri = "<connection string uri>"; try (MongoClient mongoClient = MongoClients.create(uri)) { MongoDatabase database = mongoClient.getDatabase("sample_mflix"); MongoCollection<Document> collection = database.getCollection("movies"); Bson query = eq("countries", "Spain"); try { // Retrieves and prints the estimated number of documents in the collection long estimatedCount = collection.estimatedDocumentCount(); System.out.println("Estimated number of documents in the movies collection: " + estimatedCount); // Retrieves and prints the number of documents with a "countries" value of "Spain" long matchingCount = collection.countDocuments(query); System.out.println("Number of movies from Spain: " + matchingCount); // Prints a message if any exceptions occur during the operations } catch (MongoException me) { System.err.println("An error occurred: " + me); } } } }
上記のサンプル コードを実行すると、次のような出力が表示されます(正確な数値はデータによって異なる場合があります)。
Estimated number of documents in the movies collection: 23541 Number of movies from Spain: 755
このページで言及されているクラスとメソッドについて詳しくは、次の API ドキュメントを参照してください。