#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
Первая из них была исключена из исходного запроса.