2012-04-19 60 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}})