これは、これを検索する可能性のある人にとっては完全な説明に値する可能性があるため、後世のために1つ追加してください。
から返された結果と同様です。 stream()
カーソルオブジェクトで使用できるメソッド。実装を検討する場合、ここでは「カウント」はあまり意味がありません。これは、最終的に「終了」に到達するが、それ以外の場合は単に処理したい「ストリーム」として処理することを目的としているためです。そこに着くまで。
ドライバーからの標準の「カーソル」インターフェースを検討した場合、集計カーソルが同じでない理由はいくつかあります。
-
カーソルを使用すると、「修飾子」アクションを実行前に処理できます。これらは
.sort()
のカテゴリに分類されます 、.limit()
および.skip()
。これらはすべて、パイプラインで指定された集約フレームワークに対応するディレクティブを実際に持っています。単純なクエリに対する後処理オプションとしてだけでなく、「どこにでも」表示される可能性のあるパイプラインステージとして、同じ「カーソル」処理を提供することはあまり意味がありません。 -
その他のカーソル修飾子には、
.hint()
などの特殊機能が含まれます。 、.min()
および.max()
これは「インデックスの選択」と処理の変更です。これらは集約パイプラインに役立つ可能性がありますが、現在、クエリの選択にこれらを含める簡単な方法はありません。ほとんどの場合、前のポイントのロジックは、「カーソル」に同じタイプのインターフェイスを使用するポイントをオーバーライドします。
その他の考慮事項は、カーソルを実際に使用して何をしたいのか、なぜカーソルを「戻したい」のかということです。カーソルは通常、最後に到達するまでのみ処理され、使用可能な「バッチ」で処理されるという意味で「片道トリップ」であるため、「カウント」は実際には最後に来るという合理的な結論になります。実際、その「キュー」が最終的に使い果たされたとき。
実際、標準の「cursor」実装にはいくつかのトリックがありますが、主な理由は、クエリプロファイリングエンジンが特定の数のドキュメントを「スキャン」して、どのドキュメントを「スキャン」する必要があるため、これが「メタ」データの概念を拡張するだけであるためです。結果で返すアイテム。
ただし、集約フレームワークはこの概念を少し活用しています。標準のクエリプロファイラーで処理されるのと同じ結果があるだけでなく、追加のステージもあります。これらのステージはいずれも、処理される「ストリーム」に実際に返される結果の「カウント」を「変更」する可能性があります。
繰り返しになりますが、これを学術的な観点から見て、「確かに、クエリエンジンはカウントの「メタデータ」を保持する必要がありますが、その後に何が変更されたかを追跡することはできませんか?」これは公正な議論であり、<などのパイプライン演算子code> $ match
および $ group
または $ unwind
$ project
を含めることもできます
新しい $ redact
、すべては、各パイプラインステージで「処理されたドキュメント」を独自に追跡し、完全なパイプライン結果カウントを説明するために返される可能性のある「メタデータ」でそれを更新するための合理的なケースと見なすことができます。
最後の議論は合理的ですが、現時点では、集計パイプラインの結果に対する「カーソル」の概念の実装は、MongoDBの新しい概念であることも考慮してください。最初の設計時点でのすべての「合理的な」期待は、ドキュメントを組み合わせた結果の「ほとんど」がBSONの制限を制限するサイズではないということであったとかなり主張できます。しかし、使用法が拡大すると、認識が変化し、適応するために物事が変化します。
したがって、これは「変更される可能性があります」が、「現在」実装されている方法ではありません。 .count()
標準のカーソル実装では、スキャンされた数値が記録される「メタデータ」にアクセスできます。現在の実装のどのメソッドでも、 .itcount()
と同様に、すべてのカーソル結果が取得されます。 シェルで行います。
「データ」イベントをカウントし、最後に「カウント」として何か(おそらくJSONストリームジェネレーター)を発行することにより、「カーソル」アイテムを処理します。 「事前に」カウントする必要があるユースケースの場合、出力は妥当なサイズのドキュメント全体であるため、とにかくカーソルの有効な使用法とは思えません。