从Mongo中通过id删除旧文档

5
在我的当前项目中,我们使用Mongo来存储大量文档(约100亿个)。如何使用字段_id删除最旧的一半文档,因为如果我使用索引字段“时间戳”,在当前速度下该操作将需要约3年才能完成。
2个回答

6
这里是一个MongoDB-User Google Groups的帖子链接,讨论基于时间戳生成ObjectIds: http://groups.google.com/group/mongodb-user/browse_thread/thread/262223bb0bd52a83/3fd9b01d0ad2c41b 从这个帖子中可以得知,从Mongo ObjectIds中提取时间戳的方法在Mongo文档“优化Object IDs”中有解释。链接如下: http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield 根据该帖子中的示例,ObjectIds可以从Unix时间戳的秒数中创建:
> 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")

使用上述公式,您可以从任何日期创建ObjectID,并查询较小ObjectIDs的文档。
如果您的应用程序将基于时间保存数据并在达到一定年龄后删除数据,则将文档存储在单独的集合中可能更可取;每天、每周或任何最适合您的应用程序的时间范围一个集合。删除整个集合比删除单个文档需要更少的开销,因为它可以通过单个操作完成。db.<collection>.remove({query})将为返回的每个文档执行写操作,正如您所观察到的,对于大量文档来说可能速度过慢。

5

只需找到中间的_id并删除所有旧条目:

Mongo shell:

// 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}})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接