我有一系列包含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)
答案 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