Mongodb: создание идентификатора заказа (уникального) на основе метки времени, похожего на идентификатор BSON.

У меня есть коллекция сообщений с отметками времени updated_at. Я хочу получать документы партиями, отсортированные по метке времени updated_at (сначала самые последние) без использования пропуска (поскольку это замедляется при больших значениях). Я мог бы передать отметку времени последнего документа набора в следующий запрос и использовать {$lt => last_time_stamp} для получения следующего пакета, но нет гарантии уникальности updated_at (может быть несколько вставок/записей одновременно). Другой подход может заключаться в том, что я использую $lte и отбрасываю повторяющиеся записи на стороне клиента (опять же, это может быть ошибкой, если размер пакета состоит только из повторяющихся записей, то есть все записи в пакете были отправлены с одной и той же меткой времени). Обратите внимание, что отметка времени updated_at изменяется в зависимости от некоторых конкретных событий, поэтому я не могу полагаться на идентификатор BSON для заказа.

Как обеспечить получение (создание) уникального идентификатора в виде идентификатора BSON с использованием метки времени updated_at и как изменить его всякий раз, когда изменяется updated_at, чтобы менялся порядок. Я использую mongoid в приложении для рельсов.

Существуют ли какие-либо другие подходы для достижения этого? В настоящее время я запрашиваю так:

Post.desc(:updated_at).where(:user => user).where(:updated_at.lt => last_entry_timestamp).limit(10)

person amit_saxena    schedule 26.11.2013    source источник


Ответы (1)


Вы должны создать ObjectId из времени updated_at и обновлять его каждый раз, когда вы изменяете время updated_at. Если вы используете Mongoid 3, который теперь использует Moped в качестве драйвера MongoDB, вы можете сделать что-то вроде этого:

Мопед::BSON::ObjectId.from_time(Time.new)

Я думаю, вы уже включили Mongoid::Timestamps::Updated, так что в в конце вы получите что-то похожее на:

НЕПРОВЕРЕННЫЙ КОД

class MyModel
 include Mongoid::Document
 include Mongoid::Timestamps::Updated 

 field :updated_at_id, type: Moped::BSON::ObjectId

 set_callback :create, :before, :set_updated_at_id
 set_callback :update, :before, :set_updated_at_id

 def set_updated_at_id
   if able_to_set_updated_at?
     self.updated_at_id = Moped::BSON::ObjectId.from_time(Time.now.utc)
   end
 end

end

Документацию по Moped для Moped::BSON::ObjectId можно найти здесь

Код вдохновлен Mongoid::Timestamps::Updated исходным кодом, который можно найти здесь

person Enrique Fueyo    schedule 26.11.2013