2011-06-29 41 views
0

現在,我正在做2個步驟。我想消除其中的一個。如何讓我的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只需要我做一個查詢,並給我total_results。

+1

我爲什麼得到-1? – TIMEX

+2

如果你想要的頁數不能消除任何這些查詢。即使您可以以某種方式將它組合起來 - 數據庫仍將在內部執行相同數量的操作。 – keymone

+0

感謝keymone。第一個查詢非常密集? (更好的問題:它與第二個查詢相比有多密集)? – TIMEX

回答

1

您只需要一個查詢。在shell試試這個:

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

現在,你可以得到總結果集的大小:

cursor.count() 
1000 

而且結果集的大小回吐跳過並限制到:

cursor.count(true) 
10 

請注意,服務器將完成確定兩個數字所需的全部工作,並且如果服務器上的可用數據多於使用第一個結果返回的數據,則將發出新的計數查詢。換句話說,更乾淨的代碼,但並不總是更多的性能。

+0

那麼,性能與執行兩個查詢相同? – TIMEX

+0

它總是比兩個查詢更快或更快。確切的性能取決於服務器是發送所有結果數據還是僅發送第一批。在後一種情況下,cursor.count()將需要一個額外的命令發送到服務器。 –

+0

我正在使用這種方法。非常感謝。哦,最後一件事情---如果我「跳躍」和限制(在遊標中)...「排序」......這不會影響運行計數()...對嗎? – TIMEX