我有这样的查询:
@allJobs = Job.where(:merchant_id => session[:admin_id].to_s).sort(:start_date.desc).limit(100)
当我运行.count时,我得到:
jobs count 1720
我希望看到:
jobs count 100
我做错了什么?
如果我尝试运行Job.all(query).limit(100),我得到“数组#foo的未定义方法限制”
似乎我无法将结果限制为由start_date按降序排序的100条记录!
更新:
我甚至不能做这样简单的事情:
@allJobs = Job.limit(100)
Rails.logger.info("@allJobs count is " + @allJobs.count.to_s)
控制台:
@allJobs count is 2080
据我所知,.limit()完全没用。
答案 0 :(得分:1)
问题是MongoDB游标的count()
和limit()
没有按照您预期的方式进行交互。
默认情况下,cursor.count()
显示光标引用的文档数,但不考虑限制。
cursor.limit()
选项确定光标将返回的最大文档数。
如果您通过mongo
shell进行查询,则可以使用cursor.count(true)
让count()
尊重限制。我怀疑这可能也适用于MongoMapper。
我还会尝试使用where()
等较小限制的limit(5)
查询,以便您在打印结果时更轻松地确认限制是否按预期工作。
如果我尝试运行Job.all(query).limit(100),我得到“数组#foo的未定义方法限制”
MongoMapper的all()
将结果作为数组返回,因此应用光标限制为时已晚,因为文档已经被提取。
答案 1 :(得分:1)
对我而言,使用where开始我的子句,并进一步缩小它们或修改它们似乎是合乎逻辑的......在MongoMapper中,我发现查询严格比一个需要适当的SQL SELECT查询要松散得多“松散”订单...我倾向于以这种方式或多或少地写我的查询:
ModelClass.where(some criteria).[sort | order | another where clause | fields | limit].[all | first | paginate]
此外,重要的是要注意MongoMapper返回一个查询,并且实际上执行查询,直到您添加需要结果的内容。例如:all
,first
,paginate
,sort
等。
2.0.0-p247 :001 > Structure.where(:address => /NJ/).count
=> 22
2.0.0-p247 :002 > Structure.where(:address => /NJ/).limit(2).count
=> 22
2.0.0-p247 :003 > Structure.where(:address => /NJ/).limit(2).all.count
=> 2
此处提供更多详细信息:http://technicaldebt.com/mongomapper-query-review/以及基础Plucky查询语法,此处为:https://github.com/mongomapper/plucky