2013-10-04 72 views
2

我有一個數據集合,我想通過插入時間對它進行排序。我沒有任何額外的字段來存儲插入時間。但正如我found out我可以從Id這一次。使用唯一標識符字段對插入日期時間進行排序

我曾嘗試這樣的代碼:

return bookmarks.find({}, {sort: {_id.getTimestamp(): 1}, limit: 10}); 

return bookmarks.find({}, {sort: {ObjectId(_id).getTimestamp(): 1}, limit: 10}); 

,但得到的錯誤信息:

=> Your application has errors. Waiting for file change. 

有什麼辦法通過插入日期時間只使用排序集合ID字段?

回答

2

目前這對Meteor來說是不可能的,即使它是在MongoDB中也是如此。用流星創建的ObjectID不包含時間戳。請參閱http://docs.meteor.com/#collection_object_id

原因是客戶端代碼可以插入代碼,並且可以在服務器上延遲到達,因此不能保證ObjectID的時間戳部分是準確的。除了延遲之外,客戶端的日期被使用意味着它們是否關閉會導致錯誤的數據。我認爲這是他們使用ObjectID的原因,但它完全是隨機的。

如果你想按日期排序,你必須單獨存儲時間/日期。

+1

也許使用服務器端收集鉤子來創建文檔時注入時間戳會在這裏有所幫助? –

1

我敲出的部分不準確。流星使用它是自己的身份證代,這是基於一個隨機字符串,雖然不適用我以前鏈接的文檔。檢查下sasha.sochka的評論。

如果您只是對_id字段進行排序,它幾乎不是100%。雖然在構建時,前4個字節是以秒爲單位的時間戳(因此對getTimestamps值進行排序並不會更好)。在一秒鐘的分辨率下,您無法得到確切的訂單,因爲它在文檔中提到: http://docs.mongodb.org/manual/reference/object-id/#objectid

您仍然可以嘗試檢查oplog中針對您的集合的插入/更新操作的確切順序,如果你有一個oplog,但是無論如何,因爲它是一個封頂的集合,你只會看到最近的操作。 http://docs.mongodb.org/manual/core/replica-set-oplog/

+0

這是不正確的關於流星的mongodb。 Meteor使用它自己修改的mongo中的ObjectID。 –

+0

對我而言,你是對的,我更新了我的答案。 – attish

相關問題