0

我有一个 mongo 集合,其中包含不到 200 万个文档,并且我有一个希望运行的查询,它将根据日期字段删除大约 700.000 个文档。

删除查询如下所示:

db.collection.remove({'timestamp': { $lt: ISODate('XXXXX') }})

在这种情况下,确切的日期并不重要,语法是正确的,我知道它会起作用。但是,我也知道这将需要很长时间(上次我们做类似的事情花了不到 2 个小时)。

还有另一个我无法停止的同时插入和更新记录的过程。但是,只要这些插入/更新“最终”被执行,我不介意它们被推迟。

我的问题是:有没有办法设置特定查询/操作的优先级,使其运行得更快/在之后发送的所有查询之前?在这种情况下,我假设 mongo 必须在数据库中进行大量数据交换,这对性能没有帮助。

4

2 回答 2

0

我不知道优先级是否可以微调,所以可能会有更好的答案。

一个简单的解决方法可能是文档中建议的:

注意:对于大型删除操作,将要保存的文档复制到新集合然后drop()在原始集合上使用可能更有效 [原文如此]。

另一种方法是编写一个简单的脚本,获取例如 500 个元素,然后使用$in. 您可以添加某种sleep()来限制删除过程。这是在新闻组中推荐的

如果您将来会遇到此问题,您可能希望

  • 使用逐日收集,这样您就可以在数据变得足够老时简单地删除整个收集(这使得聚合更加困难),或者
  • 使用TTL-Collection,其中项目将自动超时,无需大量删除。
于 2013-02-04T14:19:17.303 回答
0

如果您的应用程序需要删除超过一定时间的数据,我建议使用TTL 索引。前(来自 mongodb 网站):

db.log.events.ensureIndex( { "status": 1 }, { expireAfterSeconds: 3600 } )

这就像一个有上限的集合,除了数据是按时间删除的。对您来说最大的胜利是它在后台线程中工作,您的插入/更新几乎不会受到伤害。我在生产中基于 SaaS 的产品上使用了这种技术,就像一个魅力。

这可能不是您的用例,但我希望对您有所帮助。

于 2013-02-04T15:31:28.600 回答