2011-06-09 58 views
5

我正在使用Mongoid來處理MongoDB。一切都很好,我非常喜歡,等等。在我的博客應用程序(posts控制器,指數動作)我有這樣的代碼:獲取有限Mongoid查詢結果和.count的最後一個文檔()

@posts = Post.without(:comments) 
@posts = @posts.my_search(params[:s]) if params[:s] 
@posts = @posts.order_by([:created_at, :desc]) 
@posts = @posts.where(:pid.lt => params[:p].to_i+1) if params[:p] 
@posts = @posts.limit(items_per_page+1) 

與「裏」是實現我自己的分頁方法的一部分(允許只在一個方向顯示的結果,但沒有skip(),我認爲是一個加號)。現在,有幾個小問題讓我感到不舒服:

對於我的分頁工作,我需要獲得該限制內的最後一篇文章。但是當我做@posts.last我得到了整個查詢的最後文件沒有限制。好吧,這很奇怪,但不是一個大問題。除此之外,查詢結果的行爲幾乎與普通數組類似,所以此時我得到的最後一個元素是@posts.pop(有趣,但它不會刪除任何文檔)或@posts.fetch(-1)

我有一種感覺,這不是「正確的方式」,有些東西更加優雅。也 @posts.count生成第二個查詢完全相同的第一個(沒有限制),但只有「數」,我不喜歡它。

如果我做的最後一行看起來像

@posts = @posts.limit(items_per_page+1).to_ary 

到查詢結果轉換成數組,一切只生成一個查詢(好),但現在@posts.count停止報告我需要的東西(文件總量無極限應用)並且表現完全像@posts.size - 它返回items_per_page+1或更少(壞)。

所以,這裏是我的問題:

1)什麼是「正確」的方式來獲得給定的期限內查詢結果的最後文件?

2)如何獲得應用了給定條件的文檔的總量而不產生額外的查詢?

UPD:

3)@ posts.first產生額外的查詢,如何預防和剛剛獲得第一個文檔之前,我遍歷所有文件?

回答

3

獲取最後一個文檔:

Post.last 

獲得最後一個文檔與其他一些疑問:

Post.order_by([:created_at, :desc]).last 

獲得總數文件:

Post.order_by([:created_at, :desc]).count 

建議:只要使用內置的分頁

@posts = Post.limit(10).paginate(:page=>pararms[:page]) 

後:

<%= will_paginate @posts %> 

至於其他查詢 - mongoid懶加載的一切:

@posts = Post.all #no query has been run yet 
@posts.first #Ok, a query has finally been run because you are accessing the objects 
+0

你回答的問題,我也沒問:)添加.limit(2)前.last,看看它會有什麼樣的表現。另外.count生成額外的查詢,我一直在問如何避免它。我刪除了will_paginate和kaminari,因爲我不喜歡skip(),也因爲他們不允許「跳轉」到索引操作中的特定文章。另外,在@ post.first之後嘗試迭代@ posts.each,你會看到2個查詢。 – 2011-06-09 14:10:56

+0

如果您只想要一個查詢,那麼您需要將所有內容都推送到一個數組中。 @posts = Post.whatever.all.to_a ...那麼@ posts.first和@ posts.last將是ruby enumerator方法而不是mongoid命令。 – 2011-06-09 14:24:07

+0

是的,我在我的問題中寫了這個,但是@ posts.count生成額外的查詢,如果我在to_ary之前執行它,並且它只返回有限的數量,如果我之後執行它。有沒有辦法在limit()之前執行查詢和計數結果? – 2011-06-09 14:26:17

相關問題