定義
countコレクションまたはビューに含まれるドキュメント数をカウントします。このカウントとコマンドのステータスを含むドキュメントを返します。
Tip
注意
MongoDB ドライバーは、それぞれのカーソルおよびコレクション
count()API(countコマンドを実行するもの)を廃止し、countDocuments()およびestimatedDocumentCount()に対応する新しい API を採用します。特定のドライバーの特定の API 名については、ドライバー API ドキュメントを参照してください。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M0 およびフレックス クラスターで限定的にサポートされています。詳細については、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
注意
MongoDB はcount コマンドのオプション名を検証します。不明なオプション名を指定すると、コマンドはエラーを発生させます。
db.runCommand( { count: <collection or view>, query: <document>, limit: <integer>, skip: <integer>, hint: <hint>, readConcern: <document>, maxTimeMS: <integer>, collation: <document>, comment: <any> } )
コマンドフィールド
count には、次のフィールドがあります。
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| string | カウントするコレクションまたはビューの名前。 | ||||||||||
| ドキュメント | オプション。 コレクションまたはビューでカウントするドキュメントを選択するクエリ。 | ||||||||||
| integer | オプション。 返される一致するドキュメントの最大数。 | ||||||||||
| integer | オプション。 結果を返す前にスキップするマッチするドキュメントの数。 | ||||||||||
| 文字列またはドキュメント | 任意。使用するインデックス。 インデックス名を文字列で指定するか、インデックス仕様書を指定する。 | ||||||||||
| ドキュメント | オプション。 読み取り対象を指定します。 このオプションの構文は次のとおりです。 次の読み取り保証レベルが利用できます。
読み取り保証 (read concern) のレベルについて詳しくは、「読み取り保証 (read concern) レベル」を参照してください。 | ||||||||||
| non-negative integer | 任意。 時間制限をミリ秒単位で指定します。 MongoDB は、 | ||||||||||
| ドキュメント | 任意。 操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 | ||||||||||
| any | 任意。このコマンドに添付するユーザー指定のコメント。設定すると、このコメントは以下の場所にこのコマンドの記録と合わせて表示されます。
コメントには、有効な BSON 型(string, integer, object, array など)を使用できます。 |
Stable API でのサポート
MongoDB 6.0 以降では、count コマンドがStable API V1 に含まれています。Stable API で count コマンドを使用するには、MongoDB 6.0 以降を実行している配置にドライバーを接続する必要があります。
動作
クエリ述語のない不正確なカウント
クエリ述語なしでcountを呼び出すと、不正確なドキュメント数が返される可能性があります。 クエリ述語がない場合、 countコマンドはコレクションのメタデータに基づいて結果を返します。その結果、おおよそのカウントが返される場合があります。 特に、
シャーディングされたクラスターでは、結果のカウントで孤立したドキュメントが正しく除外されません。
シャットダウンを正常に行わなかった後、またはファイルのコピーによる初期同期の後は、カウントが正しくない場合があります。
コレクション メタデータに基づくカウントについては、「count オプション付きの CollStats パイプライン ステージ」も参照してください。
カウントとトランザクション
トランザクションでcountを使用すると、結果のカウントはコミットされていないマルチドキュメントトランザクションを除外しません。
詳細については、「トランザクションとカウント操作」を参照してください。
精度とシャーディングされたクラスター
シャーディングされたクラスターでは、クエリ述語なしで count コマンドを実行すると、 孤立したドキュメントが存在する場合や チャンク移行が進行中の場合に、不正確なカウントが発生する可能性があります。
このような状況を回避するには、シャーディングされたクラスターで 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 を使用して、コレクションのメタデータに基づいたおおよそのカウントを返します。
予期しないシャットダウン後の精度
mongodWired Tiger のストレージ エンジンを使用する の不正シャットダウン後、count によって報告されるカウント統計が不正確になる可能性があります。
ドリフトの量は、チェックポイントからクリーン シャットダウンまでの間に実行された挿入、アップデート、または削除操作の数によって異なります。チェックポイントは通常、60 秒ごとに発現します。ただし、デフォルト以外の --syncdelay 設定で実行されている mongod インスタンスでは、チェックポイントの頻度が増減する可能性があります。
不正なシャットダウン後に統計を復元するには、mongod の各コレクションに対して validate を実行します。
不正なシャットダウン後:
注意
この精度の低下は、クエリ ドキュメントを含ま ないcount 操作にのみ適用されます。
クライアントの切断
操作が完了する前にcountを発行したクライアントが切断された場合、MongoDB はcountをkillOpを使用して終了対象としてマークします。
例
次のセクションでは、 countコマンドの例を示します。
すべてのドキュメントをカウントする
次の操作は、orders コレクション内のすべてのドキュメントの数をカウントします。
db.runCommand( { count: 'orders' } )
結果では、カウントを表す n は、26 で、コマンド ステータス ok は 1 です。
{ "n" : 26, "ok" : 1 }
クエリに一致するドキュメントをカウントする
次の操作は、ord_dt フィールドの値が Date('01/01/2012') より大きい orders コレクション内のドキュメントのカウントを返します。
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') } } } )
結果では、カウントを表す n は、13 で、コマンド ステータス ok は 1 です。
{ "n" : 13, "ok" : 1 }
カウントするドキュメントをスキップする
次の操作は、ord_dt フィールドの値が Date('01/01/2012') より大きい orders コレクション内のドキュメントのカウントを返し、一致するドキュメントの最初の 10 件をスキップします。
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') } }, skip: 10 } )
結果では、カウントを表す n は、3 で、コマンド ステータス ok は 1 です。
{ "n" : 3, "ok" : 1 }
使用するインデックスを指定する
次の操作では、インデックス { status: 1 } を使用して、ord_dt フィールドの値が Date('01/01/2012') より大きく、status フィールドが "D" に等しい orders コレクション内のドキュメントのカウントを返します。
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') }, status: "D" }, hint: { status: 1 } } )
結果では、カウントを表す n は、1 で、コマンド ステータス ok は 1 です。
{ "n" : 1, "ok" : 1 }
デフォルトの読み取り保証を上書き
デフォルトの読み取り保証 (read concern) レベル "local" を無効にするには、readConcern オプションを使用します。
レプリカセットに対する次の操作では、大多数のノードに書き込まれたことが確認されたデータの最新のコピーを読み取るために、"majority" の 読み取り保証を指定します。
重要
"majority"のreadConcernレベルを使用するには、空でないquery条件を指定する必要があります。読み取り保証のレベルを問わず、ノード上の最新データにシステム内のデータの最新バージョンが反映されていない場合があります。
db.runCommand( { count: "restaurants", query: { rating: { $gte: 4 } }, readConcern: { level: "majority" } } )
単一のスレッドでそれ自体の書き込みの読み取りを可能にするには、レプリカセットのプライマリに対して "majority" 読み取り保証と "majority" 書込み保証を使用します。