2012-06-05 8 views
7

MongoDbでクエリを実行する際には、すべての一致の総数と、ドキュメント自体を制限付きページングされたサブセットとして取得する必要があります。mongodbは繰り返し検索せずにカウントを取得

2つのクエリで目標を達成できますが、1つのクエリでこれを行う方法はわかりません。私はある意味で、SQL_CALC_FOUND_ROWSと同等のmongo機能があることを期待しています。これは、クエリを2回実行する必要がありすぎるようです。どんな助けも素晴らしいだろう。ありがとう!

EDIT:上記を行うためのJavaコードです。

 DBCursor cursor = collection.find(searchQuery).limit(10); 
    System.out.println("total objects = " + cursor.count()); 

答えて

3

私はあなたが使用しているどの言語わからないんだけど、あなたは一般的にfindクエリの結果だカーソルのcountメソッドを呼び出した後、ドキュメント自体を得るために、同じカーソルを使用することができます。

+0

ご協力ありがとうございます、それは魅力的です。私はJavaを使用しており、カーソルにはcountメソッドがあります。 – adamSpline

+7

これは間違いです。質問は1つの*クエリ*でそれを行う方法を尋ねます。 'cursor.count() 'を使うと実際には2番目のクエリがクライアントドライバに委譲されますが、2番目のクエリはまだ実行されます。 – Raman

2

クエリを2回実行するだけでなく、不一致のリスクもあります。コレクションは2つのクエリ間で変更されるか、または各クエリが異なるバージョンのコレクションを持つレプリカセット内の別のピアにルーティングされる可能性があります。

(MongoDB JavaScriptシェルの)カーソルのcount()関数は実際に別のクエリを実行します。 "cursor.count"(括弧なし)と入力すると2つのクエリを実行するよりも優れていません。

C++ドライバでは、カーソルには「カウント」機能さえありません。 "itcount"がありますが、カーソルをループしてすべての結果をフェッチするだけです(パフォーマンス上の理由から)。 Javaドライバには "itcount"もあり、そこにはテストのためだけに使用する必要があることが書かれています。

「何かを見つけて総カウントを得る」方法は一貫して効率的ではないようです。

関連する問題