2012-10-31 144 views
6
> db.events.find() 
{ "_id" : ObjectId("50911c3e09913b2c643f1215"), "context" : "jvc8irfjc9cdnf93", "key" : "value" } 
{ "_id" : ObjectId("50911c4709913b2c643f1216"), "context" : "jvc8irfjc9cdnf93", "key" : "new value" } 
{ "_id" : ObjectId("50911c4b09913b2c643f1217"), "context" : "jvc8irfjc9cdnf93", "key" : "newer value" } 
{ "_id" : ObjectId("50911c4f09913b2c643f1218"), "context" : "jvc8irfjc9cdnf93", "key" : "newest value" } 
{ "_id" : ObjectId("50911c6309913b2c643f1219"), "context" : "0djd8vcndkfnjhv3", "key" : "value" } 

是Mongo DB服務器上的事件列表。客戶跟蹤他知道的最後一個事件,例如50911c4709913b2c643f1216,第二個。Mongo DB:獲取最後一個已知文檔後插入的所有文檔

如何獲得已知的已插入的所有事件?在這種情況下,50911c4b09913b2c643f1217,50911c4f09913b2c643f121850911c6309913b2c643f1219

回答

1

您在這裏看到的對象ID的原因是因爲規範說 time|machine|pid|inc是創建ObjectId的格式。

請注意,ObjectId中已經有一個時間組件,但這是以秒爲單位的。
Mongo中的Date類型表示從曆元開始的毫秒數,這將爲您計算出插入時間更精確。

我認爲最好的方法是使用計數器在Sequence numbers形式,如果你需要絕對的精確度超越毫秒,但如果你認爲你的應用是不是寫密集型只使用Date類型一個名爲timestamp的附加鍵的形式。

1

在您的示例中,您正在使用「內置」ObjectID。 They attempt to be unique, not sequential。您可以添加時間戳和/或使用序列號作爲官方文檔基於該屬性建議和查詢。

一旦你添加了這個新的屬性,你必須執行兩個查詢。一個獲取與客戶端指定的ID相對應的序列號或時間戳,然後用另一個查詢獲取後面插入的項目。

3

由於ObjectId默認包含inctimestamphttp://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification),你可以實際使用ObjectId瞭解通過插入時間(大約):

db.col.find({_id: {$gt: {ObjectId("50911c4709913b2c643f1216")}}}); 

然而ObjectId不能總是非常可靠的,特別是如果,在你的應用程序中,你在插入之前創建了ObjectId,實際上你知道後來創建的一個記錄實際上顯示(因爲它的前_id)。

對於在某些情況下插入,你不能信任ObjectId插入計時器,你可以添加一個ts領域的BSON Date類型(ISODate)和範圍上,使用兩個查詢,一個來獲得原始文件的時間,然後又以後獲取所有文件。

我個人更喜歡使用第二種使用BSON日期類型的方法,因爲它更加可靠和靈活。

0

由於ObjectID與其他人已經提到的基於時間的基礎上,我們可以構建我們自己的基於時間的ObjectID進行查詢。這應該節省索引空間:)

請參閱https://stackoverflow.com/a/8753670/1008449在Javascript中的實現。

相關問題