订购MongoDB查询会导致返回的行数减少

时间:2011-05-24 14:46:12

标签: mongodb mongoid

我在Mongoid(2.0.0.beta.17和2.0.2)/ MongoDB中订购时遇到问题。也许我对MongoDB没有足够的经验,你们中的一些人可以帮助我理解我做错了什么?

用户级症状是:


irb(main):024:0> Update.all.size 

=> 551

Update.ordered.size     # (see below for definition) 

=> 490

irb(main):010:0> Update.all.select{|u| u.created_at.nil?} 

=> []

当我进入mongo shell时,做:

var cursor = db.updates.find({}, {'_id': 1}).limit(600); 
while (cursor.hasNext()) printjson(cursor.next()); 

我返回 454 行。

var cursor = db.updates.find({}, {'_id': 1}).sort({created_at : 1}).limit(600); 
while (cursor.hasNext()) printjson(cursor.next());   

还会返回 454 行。

db.updates.find({}).sort({created_at: -1}).limit(1); 

从2月23日开始返回更新。但我昨天在MongoDB上有更新。 有任何想法吗?


我的模特是:

class Update 
  include Mongoid::Document 
  include Mongoid::Timestamps 
  include Paperclip 
  field :body 
  ... 
  index [[ :created_at, Mongo::DESCENDING ]] 
  ... 
  named_scope :ordered, :order_by => ([[:created_at, :desc]]) 
  ... 
end 

2 个答案:

答案 0 :(得分:0)

可以打印出created_at字段吗?

db.updates.find({}, {created_at:1}).sort({created_at: -1}).forEach(printjson) 

您可能在如何保存日期字段时遇到问题。输出有字符串吗? ISODate()?

答案 1 :(得分:0)

我没弄清楚为什么,但是做以下事情似乎解决了这个问题:

named_scope:ordered,:order_by => ([[:created_at,:desc],[:_ id,:desc]])

似乎辅助排序有帮助。

irb(main):022:0> update = Update.order_by([[:created_at, :desc], [:_id, :desc]])

irb(main):025:0> update.count
=> 556
irb(main):026:0> update.first.created_at
=> Sat May 28 02:53:33 -0700 2011
irb(main):027:0> update.second.created_at
=> Fri May 27 17:55:38 -0700 2011
irb(main):028:0> update.first.created_at.class
=> Time
irb(main):029:0> update.second.created_at.class
=> Time

其中第一个被排除在原始查询之外。