在我目前的项目中,我们使用Mongo存储大量文档(大约100Bln)。 如何使用字段_id 删除一半最旧的文档,因为如果我使用索引字段“timestamp”,此操作将在当前速度〜3年后完成。
答案 0 :(得分:3)
以下是MongoDB用户Google网上论坛帖子的链接,该帖子讨论了根据时间戳生成ObjectIds: http://groups.google.com/group/mongodb-user/browse_thread/thread/262223bb0bd52a83/3fd9b01d0ad2c41b
从帖子: 从Mongo ObjectIds中提取时间戳在下面进行了解释 Mongo文档“优化对象ID” 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})
将对返回的每个文档执行写操作,正如您所观察到的那样,对于大量文档而言可能会非常慢。
答案 1 :(得分:2)
只需找到中间的 _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}})