2011-06-29 11 views
0

今、私は2つのステップを行っています。私はそれらの1つを消したい。MongoDBのクエリをより効率的にするにはどうすればよいですか?

//Get total results, before the limit. I need this number for pagination reasons. 
total_rooms = db.rooms.find({'name':'big'}).count(); 

//Get the actual results 
rooms = db.rooms.find({'name':'big'}).skip(start).limit(num) 

私のウェブサイトのどこでも二重のクエリを実行しています。私は本当にばかげています。 Mysqlは私に1つのクエリーを要求し、total_resultsを与えます。

+1

なぜ私は-1を得ましたか? – TIMEX

+2

ページ数が必要な場合は、それらのクエリを削除できません。何らかの形で組み合わせることができたとしても、データベースは内部的に同じ数の操作を実行します。 – keymone

+0

ありがとうkeymone。最初のクエリは非常に集中的ですか? (より良い質問:それは2番目のクエリと比べてどれくらい集中的ですか)? – TIMEX

答えて

1

クエリは1つだけ必要です。シェルでこれを試してみてください:アカウントに

cursor.count() 
1000 

そして、結果セットのサイズの撮影スキップして制限:

for(var i = 0; i < 1000; i++) db.test.save({a:i}) 
cursor = db.test.find().skip(10).limit(10) 

を今、あなたは、全結果セットのサイズを取得することができ

cursor.count(true) 
10 

サーバーは両方の数値を決定するために必要なすべての作業を行い、最初の結果で返されたデータよりも多くのデータがサーバー上で利用可能な場合は、新しいカウントクエリが発行されます。言い換えれば、より洗練されたコードですが、必ずしもそれ以上のパフォーマンスはありません。

+0

したがって、パフォーマンスは2つのクエリを実行するのと同じですか? – TIMEX

+0

これは常に2つのクエリと同じくらい速いか高速です。正確なパフォーマンスは、サーバーがすべての結果データを送信したか、最初のバッチのみを送信したかによって異なります。後者の場合、cursor.count()は追加のコマンドをサーバーに送る必要があります。 –

+0

私はこのメソッドを使用しています。どうもありがとう。ああ、最後のもの---スキップとリミット(カーソル内)に沿って「並べ替え」があれば、それはカウントの実行に影響しません...) – TIMEX

関連する問題