2012-04-19 59 views
4

的Mongo舊文件中刪除在我目前的項目中,我們使用Mongo來存儲大量文件(大約100Bln)。 如何使用字段_id刪除一半最舊的文檔,因爲如果我使用索引字段「timestamp」,則此操作將在當前速度達到3年後完成。從編號爲

回答

3

這裏是一個MongoDB的用戶谷歌網上論壇帖子,討論基於時間戳生成的ObjectID鏈接: http://groups.google.com/group/mongodb-user/browse_thread/thread/262223bb0bd52a83/3fd9b01d0ad2c41b

從帖子: 提取從蒙戈的ObjectID時間戳在 蒙戈文檔解釋「優化對象ID」 http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield

在後從示例獲取的,可以從時間,以秒Unix時間創建的ObjectID:

> now = new Date() 
ISODate("2012-04-19T19:01:58.841Z") 
> ms = now.getTime() 
1334862118841 
> sec = Math.floor(ms/1000) 
1334862118 
> hex = sec.toString(16) 
4f906126 
> id_string = hex + "0000000000000000" 
4f9061260000000000000000 
> my_id = ObjectId(id_string) 
ObjectId("4f9061260000000000000000") 

使用上面的公式,你可以從任何日期創建一個對象ID,以及文件查詢與較小的ObjectIds。展望未來,如果您的應用程序將基於時間保存數據並在達到特定年齡時刪除數據,您可能會發現最好將文檔存儲在單獨的集合中;每天,每週或任何時間框架對您的應用程序最有意義。刪除整個集合需要比刪除單個文檔少很多的開銷,因爲它可以通過單個操作完成。 db.<collection>.remove({query})將針對每個返回的文檔執行寫入操作,正如您所觀察到的,對於大量文檔而言,這可能過於緩慢。

2

只需找到中間_id並刪除所有的舊條目:

蒙戈外殼:

// get total documents count/2 
var c = Math.floor(db.collection.stats()['count']/2) 

// find middle id 
var mid_id = db.collection.find().skip(c).limit(1)[0]._id 

// remove all ids older than the middle one 
db.collection.remove({_id:{$lt:mid_id}})