重要
mongosh メソッド
このページでは、 mongosh メソッドについて説明します。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません。
データベースコマンドについては、 countコマンドを参照してください。
MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。
定義
db.collection.count(query, options)検索操作を実行せずに、コレクションまたはビューに対する
find()クエリに一致するドキュメントの数を返します。注意
MongoDBドライバーは、それぞれのカーソルとコレクション
count()API を廃止し、countDocuments()とestimatedDocumentCount()の新しい API を採用します。各ドライバーの特定のAPI名については、ドライバーのドキュメントを参照してください。
互換性
このメソッドは、次の環境でホストされている配置で使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
注意
このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
db.collection.count()メソッドの形式は次のとおりです。
db.collection.count(query, options)
パラメーター
このメソッドでは、次のパラメーターが使われます。
Parameter | タイプ | 説明 |
|---|---|---|
| ドキュメント | クエリの選択基準。 |
| ドキュメント | 任意。カウントを変更するための追加オプション。 |
フィールド
options ドキュメントには、次のフィールドが含まれています。
フィールド | タイプ | 説明 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| integer | 任意。カウントするドキュメントの最大数。 | ||||||||||
| integer | 任意。カウントする前にスキップするドキュメントの数。 | ||||||||||
| 文字列またはドキュメント | 任意。インデックス名のヒント、またはクエリの仕様。 | ||||||||||
| integer | 任意。クエリの実行を許可する最大時間。 | ||||||||||
| string | 任意。読み取り保証(read concern)を指定します。デフォルトのレベルは 単一のスレッドでそれ自体の書き込みの読み取りを可能にするには、レプリカセットのプライマリに対して 読み取り保証(read concern)レベル | ||||||||||
| ドキュメント | 任意。 任意。操作に使用する照合を指定します。 照合を指定すると、大文字・小文字やアクセント記号など、文字列を比較するための言語独自のルールを指定できます。 照合オプションの構文は次のとおりです。 照合を指定する場合、 照合が指定されていなくても、コレクションにデフォルトの照合が設定されている場合( コレクションにも操作にも照合が指定されていない場合、MongoDB では以前のバージョンで使用されていた単純なバイナリ比較によって文字列が比較されます。 1 つの操作に複数の照合は指定できません。たとえば、フィールドごとに異なる照合を指定できません。また、ソートと検索を一度に実行する場合、検索とソートで別の照合を使用できません。 |
count() は db.collection.find(query).count() 構造と同等です。
動作
クエリ述語のない不正確なカウント
クエリ述語がない場合、count() はコレクションのメタデータに基づいて結果を返します。そのため、誤ったカウントが発生する可能性があります。特に、
シャーディングされたクラスターでは、結果のカウントで孤立したドキュメントが正しく除外されません。
シャットダウンを正常に行わなかった後、またはファイルのコピーによる初期同期の後は、カウントが正しくない場合があります。
コレクション メタデータに基づくカウントについては、「count オプション付きの CollStats パイプライン ステージ」も参照してください。
カウントとトランザクション
トランザクションでは、 countとシェルヘルパーcursor.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() 操作にのみ適用されます。
クライアントの切断
count() を発行したクライアントが操作が完了する前に切断された場合、 MongoDB はkillOp を使用して 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()