Mongoid::Criteria 排列在 Ruby

Mongoid::Criteria to array in Ruby

我有一个 Mongoid::Criteria 对象 data,它有 634 个结果:

#<Mongoid::Criteria
selector: {"search_id"=>155, "posted_time"=>{"$gte"=>2016-05-31 15:43:40 UTC, "$lte"=>2016-06-07 15:43:40 UTC}}
options:  {:sort=>{"posted_time"=>-1}, :limit=>200}
class:    MongoPost
embedded: false>

data.count
=> 634

data.to_a.count
=> 200

这是个问题,因为当我映射对象时,结果不是我预期的:

data.map{|element| element.type}.count
=> 200

这是怎么回事,我该如何解决?

您的标准有 limit: 200each(并且,通过扩展,map)遵守限制。这就是您获得 200 条记录的原因。

为什么 count 忽略限制 - 这是一个很好的问题。我不太清楚,但我怀疑这与分页有关。也就是说,有了一个条件对象,您就可以获取一页 并且 知道匹配记录的总数(您可以从中推断出总页数)。

要获取有限查询的数量,您可以执行以下操作:

criteria.lazy.count

这个 count 不是来自 Mongoid 的,它来自 Enumerable 并且会遵守限制。

关于取消设置限制:快速谷歌搜索没有找到合适的 api,但您始终可以用更大的值覆盖限制。这,也许:

criteria.limit(criteria.count).to_a # get all records, without limit

效率注意事项

不要被 lazy 关键字所迷惑。它只是将 mongo 关系转换为可枚举关系。没有什么懒惰的。它仍然运行查询并迭代结果集。本质上,它与

相同
criteria.to_a.count

在当前版本的 mongoid (5.x) 中,这可以通过 .count 方法的选项实现。

criteria.count(limit: 10)

或者,重复使用已在条件上设置的任何限制

criteria.count(criteria.options.slice(:limit))