定義
cursor.count()重要
mongosh メソッド
このページでは、
mongoshメソッドが文書化されます。これは Node.js などの言語固有のドライバーのドキュメントではありません。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
注意
MongoDB ドライバーは、それぞれのカーソルおよびコレクション
count()API を廃止し、countDocuments()およびestimatedDocumentCount()に対応する新しい API を採用します。特定のドライバーの特定の API 名については、ドライバー API ドキュメントを参照してください。カーソルが参照するドキュメントの数をカウントします。 一致するドキュメントの数を返すには、
count()メソッドをfind()クエリに追加します。 この操作はクエリを実行せず、代わりにクエリによって返される結果をカウントします。count()メソッドのプロトタイプ形式は次のとおりです。db.collection.find(<query>).count() count()メソッドには次のパラメーターがあります。Parameterタイプ説明applySkipLimitブール値
任意。
mongoshは、このオプションに設定した値を無視します。 この値のデフォルトはtrueです。オプションは、カウントにおいて
cursor.skip()メソッドとcursor.limit()メソッドの影響を考慮するかどうかを指定します。デフォルトでは 、count()メソッドはcursor.skip()とcursor.limit()の影響を無視します。これらのメソッドの効果を考慮するには、applySkipLimitをtrueに設定する必要があります。現在非推奨となっているレガシー
mongoshell では、このオプションに 設定が使用されていました。MongoDB は、
db.collection.find(<query>).count()構造の代替として同等のdb.collection.count()も提供します。MongoDB は、
hint()でのcount()の使用をサポートしています。例については、「使用するインデックスの指定」参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
動作
クエリ述語のない不正確なカウント
クエリ述語を指定しない find() 操作で count() を呼び出すと、count() メソッドは不正確なドキュメントのカウントを返す可能性があります。これらの count() メソッドはコレクションのメタデータに基づいて結果を返します。その結果、おおよそのカウントが返される場合があります。特に、
シャーディングされたクラスターでは、結果のカウントで孤立したドキュメントが正しく除外されません。
シャットダウンを正常に行わなかった後、またはファイルのコピーによる初期同期の後は、カウントが正しくない場合があります。
コレクション メタデータに基づくカウントについては、「count オプション付きの CollStats パイプライン ステージ」も参照してください。
カウントとトランザクション
トランザクション では、 countとshelldb.collection.count() ヘルパーcount() と を使用できません。
詳細については、「トランザクションとカウント操作」を参照してください。
シャーディングされたクラスター
シャーディングされたクラスターでは、 にクエリ述語がないcount() によって、find 孤立したドキュメント が存在する場合や チャンク移行 が進行中の場合に、 不正確な カウントが発生する可能性があります。
このような状況を回避するには、シャーディングされたクラスターで db.collection.aggregate() メソッドを使用します。
$count ステージを使用してドキュメントをカウントできます。たとえば、次の操作はコレクション内のドキュメントをカウントします。
db.collection.aggregate( [ { $count: "myCount" } ])
$count ステージは、次の$group + $project シーケンスと同等です。
db.collection.aggregate( [ { $group: { _id: null, count: { $sum: 1 } } }, { $project: { _id: 0 } } ] )
Tip
$collStats を使用して、コレクションのメタデータに基づいたおおよそのカウントを返します。
インデックスの使用
次のようなインデックスを持つコレクションを考えてみましょう。
{ a: 1, b: 1 }
カウントを実行するときに、MongoDB は次の場合にインデックスのみを使用してカウントを返すことができます。
クエリがインデックスを使用できる、
クエリにはインデックスのキーに対する条件のみが含まれており、かつ
クエリ述語が、インデックス キーの単一の連続した範囲にアクセスする。
たとえば、次の操作では、インデックスのみを使用してカウントを返すことができます。
db.collection.find( { a: 5, b: 5 } ).count() db.collection.find( { a: { $gt: 5 } } ).count() db.collection.find( { a: 5, b: { $gt: 10 } } ).count()
ただし、クエリでインデックスを使用できるが、クエリ述語が単一の連続した範囲のインデックス キーにアクセスしない場合、またはクエリにインデックス外のフィールドに関する条件が含まれている場合は、MongoDB はインデックスを使用するだけでなく、ドキュメントも読み取ってカウントを返す必要があります。
db.collection.find( { a: 5, b: { $in: [ 1, 2, 3 ] } } ).count() db.collection.find( { a: { $gt: 5 }, b: 5 } ).count() db.collection.find( { a: 5, b: 5, c: 5 } ).count()
このような場合、MongoDB はドキュメントの最初の読み取り中にドキュメントをメモリにページングすることで、後続の同じカウント操作の呼び出しのパフォーマンスを向上させます。
例
以下はcount()メソッドの例です。
すべてのドキュメントをカウントする
次の操作は、orders コレクション内のすべてのドキュメントの数をカウントします。
db.orders.find().count()
クエリに一致するドキュメントをカウントする
次の操作では、フィールド ord_dt が new
Date('01/01/2012') より大きい orders コレクション内のドキュメントの数をカウントします。
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()
カウントでドキュメントを制限する
次の操作は、limit(5) の影響を考慮して、フィールド ord_dt が new
Date('01/01/2012') より大きい orders コレクション内のドキュメントの数をカウントします。
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).limit(5).count(true)
使用するインデックスを指定する
次の操作では、{ status: 1 } というインデックスキー仕様を持つ "status_1" というインデックスを使用して、orders コレクション内のフィールド ord_dt が new Date('01/01/2012') より大きく、status フィールドが "D" に等しいドキュメントのカウントを返します。
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') }, status: "D" } ).hint( "status_1" ).count()