Упорядочивание результатов запроса MongoDB приводит к меньшему количеству возвращаемых строк

#mongodb #mongoid

#mongodb #mongoid

Вопрос:

У меня возникла проблема с упорядочением в Mongoid (2.0.0.beta.17 и 2.0.2) / MongoDB. Возможно, я просто недостаточно опытен в MongoDB, и кто-нибудь из вас может помочь мне понять, что я делаю неправильно?

Симптомами пользовательского уровня являются:

  • Запросы неправильно сортируются по дате или идентификатору
  • Сообщения пользователей отображаются не тогда, когда они кажутся такими, какими должны быть (это сайт социальной сети для садоводов, похожий на Twitter, и самые последние сообщения иногда не отображаются)

 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 и делаю:

 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); 
  

возвращает обновление от 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 
  

Ответ №1:

Можете ли вы распечатать created_at поле?

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

Возможно, у вас проблема с тем, как вы сохраняете свои поля даты. Является ли вывод там строкой? ISODate()?

Комментарии:

1. При создании экземпляра все они одинаковы, относятся к классу Time. их 454. Спасибо за ваше предложение!

Ответ №2:

Я не понял, ПОЧЕМУ, но выполнение следующего, похоже, устраняет проблему:

named_scope :упорядоченный, :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
  

Первая из них была исключена из исходного запроса.