即使使用限制,Rails Mongoid模型查询结果也会返回错误的大小/长度/计数信息

在我的rails应用程序中查询某个模型时,它会返回正确的结果,摘录sizelengthcount信息,甚至使用limit条件。

 recipes = Recipe .where(:bitly_url => /some.url/) .order_by(:date => :asc) .skip(10) .limit(100) recipes.size # => 57179 recipes.count # => 57179 recipes.length # => 57179 

我无法理解为什么会发生这种情况,它会一直显示食谱集合的总数,而且因为我使用了limit ,正确的值应该是100。

 count = 0 recipes.each do |recipe| count += 1 end # WAT count # => 100 

有人能帮助我吗? 谢谢!


Rails版本:3.2.3
Mongoid版本:2.4.10
MongoDB版本:1.8.4

从精细手册 :

– (整数)长度
又称: 尺寸

获取与查询选择器匹配的文档数。

但是.limit并没有真正改变查询选择器,因为它不会改变查询匹配的内容.offset.limit会改变返回的匹配段。 这与ActiveRecord的行为不匹配,文档对于这个微妙的观点并不完全明确。 但是,Mongoid的行为与MongoDB shell的行为相匹配:

 > db.things.find().limit(2).count() 23 

我的things集合包含23文档,您可以看到count忽略了limit

如果你想知道返回了多少结果,那么你可以to_a它:

 recipes.to_a.length 

正如其中一条评论中所提到的,在较新的Mongoid版本中(不确定哪些版本),您可以简单地使用recipes.count(true) ,这将包括限制,而不需要根据此处的API查询结果集。

在当前版本的mongoid(5.x)中, count(true)不再有效。 相反, count现在接受一个选项哈希。 其中有:limit选项

 criteria.count(limit: 10) 

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

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