定義
db.collection.count(query, options)重要
mongosh メソッド
このページでは、
mongoshメソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。データベースコマンドについては、
countコマンドを参照してください。MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
注意
バージョン 4.0 の機能と互換性のある MongoDB ドライバーは、それぞれのカーソルとコレクション
count()API を廃止し、countDocuments()とestimatedDocumentCount()の新しい API を採用します。各ドライバーの特定の API 名については、ドライバーのドキュメントを参照してください。コレクションまたはビューに対する
find()クエリに一致するドキュメントの数を返します。db.collection.count()メソッドはfind()操作を実行せず、代わりにクエリに一致する結果の数をカウントして返します。重要
クエリ述語なしで
db.collection.count()メソッドを使用しないでください。クエリ述語がない場合、 メソッドはコレクションのメタデータに基づいて結果を返します。その結果、おおよそのカウントが返される可能性があります。 特に、シャーディングされたクラスターでは、結果のカウントで孤立したドキュメントが正しく除外されません。
シャットダウンを正常に行わなかった後は、カウントが正しくない場合があります。
コレクション メタデータに基づくカウントについては、「count オプション付きの CollStats パイプライン ステージ」も参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
このメソッドでは、次のパラメーターが使われます。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | クエリの選択基準。 |
| ドキュメント | 任意。カウントを変更するための追加オプション。 |
options ドキュメントには、次のフィールドが含まれています。
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| integer | 任意。カウントするドキュメントの最大数。 | ||||||||||
| integer | 任意。カウントする前にスキップするドキュメントの数。 | ||||||||||
| 文字列またはドキュメント | 任意。インデックス名のヒント、またはクエリの仕様。 | ||||||||||
| integer | 任意。クエリの実行を許可する最大時間。 | ||||||||||
| string | 任意。読み取り保証(read concern)を指定します。デフォルトのレベルは 単一のスレッドでそれ自体の書き込みの読み取りを可能にするには、レプリカセットのプライマリに対して 読み取り保証(read concern)レベル | ||||||||||
| ドキュメント | 任意。 操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 バージョン 3.4 で追加。 |
count() はdb.collection.find(query).count()構造と同等です。
動作
カウントとトランザクション
トランザクション では、 countとshelldb.collection.count() ヘルパーcount() と を使用できません。
詳細については、「トランザクションとカウント操作」を参照してください。
シャーディングされたクラスター
シャーディングされたクラスターでは、クエリ述語のない は、 孤立したドキュメント が存在する場合やdb.collection.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 を使用して、コレクションのメタデータに基づいたおおよそのカウントを返します。
インデックスの使用
次のようなインデックスを持つコレクションを考えてみましょう。
{ 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 はドキュメントの最初の読み取り中にドキュメントをメモリにページングすることで、後続の同じカウント操作の呼び出しのパフォーマンスを向上させます。
予期しないシャットダウン後の精度
mongodWired Tiger のストレージ エンジンを使用する の不正シャットダウン後、count() によって報告されるカウント統計が不正確になる可能性があります。
ドリフトの量は、チェックポイントからクリーン シャットダウンまでの間に実行された挿入、アップデート、または削除操作の数によって異なります。チェックポイントは通常、60 秒ごとに発現します。ただし、デフォルト以外の --syncdelay 設定で実行されている mongod インスタンスでは、チェックポイントの頻度が増減する可能性があります。
不正なシャットダウン後に統計を復元するには、mongod の各コレクションに対して validate を実行します。
不正なシャットダウン後:
注意
この精度の低下は、クエリ述語を含ま ないcount() 操作にのみ適用されます。
クライアントの切断
MongoDB 4.2以降では、 db.collection.count()を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp を使用してdb.collection.count()を終了対象としてマークし 。
例
コレクション内のすべてのドキュメントのカウント
orders コレクション内のすべてのドキュメントの数をカウントするには、次の操作を行います。
db.orders.count()
この操作は、次の操作と同等です。
db.orders.find().count()
クエリに一致するすべての文書のカウント
orders コレクション内のフィールド ord_dt が new
Date('01/01/2012') より大きいドキュメントの数をカウントします。
db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )
クエリは次のクエリと同等です。
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()