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

问题描述 投票:0回答:1

我正在使用 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)

生成的第二个查询与第一个查询完全相同(无限制),但仅包含“count”,我不喜欢它。

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

@posts.count

要将查询结果转换为数组,所有内容都只生成一个查询(很好),但现在 
@posts = @posts.limit(items_per_page+1).to_ary

停止报告我需要的内容(没有应用限制的文档总数)并且其行为与

@posts.count
完全相同 - 它返回
@posts.size
或少(坏)。
所以,这是我的问题:

在给定限制内获取查询结果的最后一个文档的“正确”方法是什么?
  1. 如何在不生成额外查询的情况下获取应用给定条件的文档总数?
  2. @posts.first 生成额外的查询,如何防止它并在迭代所有文档之前获取第一个文档?
ruby-on-rails mongoid
1个回答
3
投票

items_per_page+1

获取最后一个文档以及其他一些查询:

Post.last

获取文档总数:

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

建议:只需使用内置分页

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

后来:

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

关于附加查询——mongoid 延迟加载所有内容:

<%= will_paginate @posts %>

© www.soinside.com 2019 - 2024. All rights reserved.