При заказе запроса MongoDB возвращается меньше строк - PullRequest
1 голос
/ 24 мая 2011

У меня проблема с порядком в 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?} 

=> []

Когда я вхожу в оболочку монго и делаю:

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 

Ответы [ 2 ]

0 голосов
/ 29 мая 2011

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

named_scope: order,: order_by => ([[: made_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

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

0 голосов
/ 25 мая 2011

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

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

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

...