Mongodb:基于时间戳生成排序标识符(唯一),类似于BSON id

时间:2013-11-26 12:52:20

标签: ruby-on-rails-3 mongodb mongoid mongoid3

我有一系列包含updated_at时间戳的帖子。我想分批获取文档,按照updated_at时间戳(最新的第一个)排序而不使用跳过(因为它使用较大的值减慢速度)。我可以将集合的最后一个文档的时间戳传递给下一个查询,并使用{$lt => last_time_stamp}来获取下一批,但不保证updated_at是唯一的(可以有多个插入/写入相同)时间)。另一种方法可能是我使用$ lte并丢弃客户端上的重复条目(同样,如果批量大小仅包含重复的条目,即批量中的所有条目都在相同的时间戳上发布,则这可能是错误的)。请注意,updated_at时间戳会在某些特定事件上发生变化,因此我不能依赖BSON ID进行排序。

如何确保使用updated_at时间戳获取(创建)BSON id的唯一标识符,以及每当更新updated_at时如何更改它,以便更改订单。我在rails应用程序中使用mongoid。

有没有其他方法可以实现这一目标?目前我这样查询:

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

1 个答案:

答案 0 :(得分:1)

您应该从updated_at时间创建一个ObjectId,并在每次修改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 :: BSON :: ObjectId的轻便摩托车文档可以找到here

受Mongoid :: Timestamps启发的代码::更新的源代码可以找到here