ruby-on-rails 获取有限Mongoid查询结果的最后一个文档和.count()

nue99wik  于 12个月前  发布在  Ruby
关注(0)|答案(1)|浏览(224)

我使用Mongoid与MongoDB一起工作。一切都很好,我非常喜欢它等等。在我的博客应用程序(posts控制器,index action)中,我有以下代码:

@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)

字符串
带有“where”的部分是我自己的分页方法的实现(只允许在一个方向上分页结果,但没有skip(),我认为这是一个优点)。现在,有一些小问题让我感到不舒服:
我的分页工作,我需要得到的最后一个职位的限制。但当我做@posts.last我得到的最后一个文档的整个查询没有限制。好吧,这是奇怪的,但不是一个大问题。除此之外,查询结果的行为就像几乎普通的数组,所以在这一刻,我得到的最后一个元素与@posts.pop(有趣,但它不会删除任何文档)或@posts.fetch(-1)
我有一种感觉,这不是“正确的方式”,必须有更优雅的东西。而且@posts.count生成的第二个查询与第一个查询完全相同(没有限制),但只有“count”,我不喜欢它。
如果我让最后一行看起来像

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


要将查询结果转换为数组,一切都只生成一个查询(好),但现在@posts.count停止报告我需要的内容(没有应用限制的文档总量),行为与@posts.size完全一样-它返回items_per_page+1或更少(坏)。
我的问题是
1.在给定的限制内,什么是获取查询结果最后一个文档的“正确”方法?
1.如何在不生成额外查询的情况下,获取给定条件下申请的单据总数?
1.@posts.first生成额外的查询,如何防止它,并在我删除所有文档之前只获取第一个文档?

myss37ts

myss37ts1#

获取最后一个文档:

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 lazy loads everything:

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

相关问题