我有一个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
正在做什么,我该如何解决?
答案 0 :(得分:1)
您的条件为limit: 200
。 each
(并且,扩展名为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))