Mongo_mapper限制结果

时间:2013-12-26 01:19:31

标签: mongodb ruby-on-rails-3 mongomapper database

我有这样的查询:

  @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()完全没用。

2 个答案:

答案 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返回一个查询,并且实际上执行查询,直到您添加需要结果的内容。例如:allfirstpaginatesort等。

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