count
定義
count
コレクションまたはビューに含まれるドキュメント数をカウントします。このカウントとコマンドのステータスを含むドキュメントを返します。
Tip
注意
4.0 の機能と互換性のある MongoDB ドライバーでは、それぞれのカーソルおよびコレクション
count()
API(count
コマンドを実行)が廃止され、代わりにcountDocuments()
およびestimatedDocumentCount()
に対応する新しい API が採用されます。特定のドライバーの具体的な API 名については、ドライバー API ドキュメントを参照してください。
互換性
このコマンドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
重要
このコマンドは、M 0 、M 2 、および M 5クラスターで限定的にサポートされています。 詳細については、「サポートされていないコマンド 」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このコマンドの構文は、次のとおりです。
注意
バージョン4.2以降、 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 } } ] )
予期しないシャットダウン後の精度
mongod
Wired Tiger のストレージ エンジンを使用する の不正シャットダウン後、count
によって報告されるカウント統計が不正確になる可能性があります。
ドリフトの量は、チェックポイントからクリーン シャットダウンまでの間に実行された挿入、アップデート、または削除操作の数によって異なります。チェックポイントは通常、60 秒ごとに発現します。ただし、デフォルト以外の --syncdelay
設定で実行されている mongod
インスタンスでは、チェックポイントの頻度が増減する可能性があります。
不正なシャットダウン後に統計を復元するには、mongod
の各コレクションに対して validate
を実行します。
不正なシャットダウン後:
注意
この精度の低下は、クエリ ドキュメントを含ま ないcount
操作にのみ適用されます。
クライアントの切断
MongoDB 4.2以降では、 count
を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp
を使用してcount
を終了対象としてマークし 。
例
次のセクションでは、 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"
書込み保証を使用します。