的Mongo旧文件中删除在我目前的项目中,我们使用Mongo来存储大量文件(大约100Bln)。 如何使用字段_id删除一半最旧的文档,因为如果我使用索引字段“timestamp”,则此操作将在当前速度达到3年后完成。从编号为
Q
从编号为
4
A
回答
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}})
相关问题
- 1. JavaScript从编号获取编号
- 2. jquery从编号获得编号
- 3. 从按键获取编号为Int
- 4. 回声编号为
- 5. 无法为编号为
- 6. Prolog的DCG中:从编程符号转换为逻辑符号
- 7. KendoUI网格编号列不会编辑为编号
- 8. 从计划中编号和编号或列表和编号构建列表
- 9. 如何编号从MySQL
- 10. VBA从HTML获取编号
- 11. 为什么编号从1改为1碰巧使用NHibernate
- 12. xslt编号有线行为
- 13. wxpython控制编号为
- 14. SQL Server - 重新编号为
- 15. 获得最大编号为
- 16. 如果变量编号为
- 17. Vb.net格式编号为String
- 18. 无法转换编号为
- 19. 在面板编号为
- 20. 程序集编号为ascii
- 21. 从报价编号获取产品编号 - Magento 1.9
- 22. 如何从最小编号到最大编号 - Java?
- 23. 从照片编号获取Facebook照片编号
- 24. 从类型号为
- 25. 使用输入值作为编号切换问题编号
- 26. 用随机颜色编号为每个单词编号
- 27. 重新编号名称作为新列中的编号,但R不会识别为编号
- 28. 为什么GObject属性从1开始编号?
- 29. python从日期范围中找到唯一日期编号为
- 30. Amibroker:将日期编号从datenum()转换为字符串