我有一组带有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::更新的源代码,可以在这里找到