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: 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
在当前版本的 mongoid (5.x) 中,这可以通过 .count
方法的选项实现。
criteria.count(limit: 10)
或者,重复使用已在条件上设置的任何限制
criteria.count(criteria.options.slice(:limit))
我有一个 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: 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
在当前版本的 mongoid (5.x) 中,这可以通过 .count
方法的选项实现。
criteria.count(limit: 10)
或者,重复使用已在条件上设置的任何限制
criteria.count(criteria.options.slice(:limit))