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



我有一组带有updated_at时间戳的帖子。我想批量获取文档,按updated_at时间戳(最新优先)排序,而不使用skip(因为它的值越大,速度越慢)。我可以将集合的最后一个文档的时间戳传递给下一个查询,并使用{$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)

您应该从updated_at time创建一个ObjectId,并在每次修改updated_at时更新它。如果你使用的是Mongoid3,它现在使用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的Moped文档

中的代码灵感来自Mongoid::Timestamps::更新的源代码,可以在这里找到

最新更新