2013-11-26 12 views
0

我有一個包含updated_at時間戳的帖子集合。我想批量獲取文檔,按照updated_at timestamp(最新的第一個)排序,而不使用跳過(因爲它以較大的值減慢)。我可以將集合中最後一個文檔的時間戳傳遞給下一個查詢,並使用{$lt => last_time_stamp}來獲取下一批,但不能保證updated_at是唯一的(可以同時有多個插入/寫入)。另一種方法是,我使用$ lte並放棄客戶端的重複條目(同樣,如果批量大小僅包含重複條目,即批次中的所有條目都發布在相同時間戳上,則這可能是錯誤的)。請注意,updated_at時間戳在某些特定事件上發生變化,所以我不能依靠BSON id進行排序。Mongodb:根據時間戳生成一個排序標識符(唯一),類似於BSON編號

如何確保我使用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

你應該創建一個從的updated_at時間的ObjectId和更新它每次修改的updated_at時間。如果您正在使用Mongoid 3,它現在使用作爲輕便摩托車駕駛員的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 

爲輕便摩托車:: BSON ::的ObjectId助力車文檔可以發現here

靈感源代碼Mongoid :: Timestamps ::可以找到更新源代碼here

相關問題