【问题标题】:`mongo` Query To Purge Old Entries`mongo` 查询清除旧条目
【发布时间】:2013-03-22 23:39:08
【问题描述】:

谁有一个方便的mongo 命令来从数据库中删除早于 X 日期/ X 天的所有条目?

基本上有一个开发和生产数据库,我希望稍微修剪一下开发数据库以限制大小。

感谢您的帮助!

【问题讨论】:

  • 他们大部分都有日期时间字段。为了简洁起见,让我们假设他们都这样做。我总是可以按 _id 对其进行排序,并且仅在需要时保留最后 X 个文档。

标签: mongodb


【解决方案1】:

你可以在 mongo shell 中做这样的事情。

var older=Date.parse("2013-03-01"),collection=db.so,all=collection.find();
all.forEach(function(doc) { var ts = doc._id.getTimestamp();
    if (ts < older) { collection.remove(doc); } });

上述行(您将粘贴到 shell 中)将删除在 2013 年 3 月 1 日之前创建的指定集合 (collection=db.so) 中的所有文档。它依赖于每个 ObjectId 都有一个内嵌timestamp(基于文档创建的timestampdocs)),可检索使用。

您当然可以更改查询以查找文档中的特定时间戳字段。

if (doc.timestampField < older) { collection.remove(doc); } }) 

【讨论】:

  • 当我运行它时它确实使我的 MongoDB 实例崩溃了,但是我有 95% 的把握这会像宣传的那样工作。今晚交通不畅的时候我会运行这个,看看她怎么样。谢谢!
  • 您可能希望将逻辑移至以您最喜欢的编程语言编写的小应用程序中。 mongodb shell JS 支持的行数/复杂性似乎是有限制的,所以我不能用它做太多,也不能增加任何鲁棒性。我无法让它崩溃,但我的开发人员工作站没有太多可以删除的数据。
  • 是的,肯定是更好的主意。我应该能够很容易地做出一些事情,我唯一想知道的是_id.getTimestamp()。看着这个答案:stackoverflow.com/questions/6452021/…我不认为这会是一个问题!
【解决方案2】:

您可以使用 mongo 在指定时间后删除数据的概念,通过设置 TTL 使集合中的数据过期。

请参考以下链接 http://docs.mongodb.org/manual/tutorial/expire-data/

【讨论】:

  • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2018-08-10
相关资源
最近更新 更多