MongoDBを使用するためにMongoidを使用しています。すべてが大丈夫です、私は非常に好きです。私のブログのアプリケーション(ポストコントローラ、indexアクション)で、私はこのコードを持っている:制限付き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 @はそれを防ぎ、ちょうど私がすべてのドキュメントを反復処理する前に、最初の文書を取得する方法を、追加のクエリを生成しますか?いくつかの他のクエリで最後の文書を入手
Post.last
:
Post.order_by([:created_at, :desc]).last
取得総数書類:
Post.order_by([:created_at, :desc]).count
が勧告は:だけに建て使用
追加のクエリについては、怠惰な負荷にすべてをmongoid .lastと同様に動作するかを確認します。また、.countは追加のクエリを生成し、私はそれを避ける方法を尋ねてきました。 will_paginateとkaminariを削除しました。私はskip()が嫌いですし、インデックスアクションの特定のポストにジャンプすることもできないからです。また、@ posts.firstの後に@ posts.eachを繰り返し実行すると、2つのクエリが表示されます。 –
1つのクエリしか持たない場合は、すべてを配列にプッシュする必要があります。 @posts = Post.whatever.all.to_a ... @ posts.firstと@ posts.lastは、mongoidコマンドではなく、ルビの列挙子メソッドになります。 –
はい、それについて私の質問で書いたが、@ posts.countはto_aryの前にそれを実行すると追加のクエリを生成します。クエリを実行してlimit()の前に結果を数える方法はありますか? –