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

时间:2011-06-09 12:27:20

标签: ruby-on-rails mongoid

我正在使用Mongoid来处理MongoDB。一切都很好,我非常喜欢等等。在我的博客应用程序(发布控制器,索引操作)中,我有以下代码:

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

我有一种感觉,这不是“正确的方式”,并且有更优雅的东西。也 @posts.count生成第二个查询与第一个查询完全相同(没有限制),但只有“count”,我不喜欢它。

如果我让最后一行看起来像

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

将查询结果转换为数组,一切只生成一个查询(好),但现在@posts.count停止报告我需要的内容(未应用限制的文档总数),行为与@posts.size完全相同 - 它会返回items_per_page+1或更少(不好)。

所以,这是我的问题:

1)在给定限制内获取查询结果的最后一个文档的“正确”方法是什么?

2)如何在不产生额外查询的情况下获取给定条件的文档总数?

UPD:

3)@ posts.first生成其他查询,如何在我迭代所有文档之前阻止它并获取第一个文档?

1 个答案:

答案 0 :(得分: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 lazy加载所有内容:

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