Mongoid :: Ruby中的数组标准

时间:2016-06-07 16:01:18

标签: ruby-on-rails arrays ruby mongodb mongoid

我有一个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

正在做什么,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您的条件为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

答案 1 :(得分:1)

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

criteria.count(limit: 10)

或者,重用已在标准上设置的任何限制

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