当前位置: 首页 > 知识库问答 >
问题:

如何从MongoDB中删除数据而不使其减速到停止?

严峰
2023-03-14

是否有一种方法可以以好的方式删除数据,不时地释放锁?

共有1个答案

呼延震博
2023-03-14

批量操作在这里可能会有帮助。无序的bulk.find(queryDoc).remove()基本上是为大量操作而优化的db.collection.remove(queryDoc)的版本。它的用法非常简单:

var bulk = db.yourCollection.initializeUnorderedBulkOp()
bulk.find(yourQuery).remove()
bulk.execute()

有关详细信息,请参阅MongoDB文档中的bulk.find().remove()。

这种方法背后的想法不是为了加快移除速度,而是为了产生更少的负载。在我的测试中,与db.collection.remove(query)相比,负载减少了一半,所用时间略少。

这使我得出结论,您可能正在经历收集扫描。如果我是对的,那么会发生以下情况:您的查询包含索引中不包含的字段或字段组合,或者不能为其构造索引交集。这就迫使mongod从磁盘中查找、访问和读取数据库中每个文档的字段。

因此,在remove操作之前,在后台创建一个包含查询中每个字段的索引可能会有所帮助,尽管这有违直觉。

db.collection.createIndex(
  {firstFieldYouQueryBy:1,...,NthFieldYouQueryBy:1},
  {background:true}
)

尽管此操作将在后台完成,但shell将阻塞。这可能需要一段时间。您可以通过打开第二个shell来查看状态,并使用:

db.currentOp()

(你得搜索一下)。

创建索引时(您可以使用db.collection.getIndexes())进行检查),删除操作应该更高效,因此速度更快。当质量移除完成后,您当然可以删除索引,如果不需要的话。

使用索引,可以防止集合扫描,从而大大加快移除速度。

 类似资料:
  • 我用Hibernate 4.3.8创建了一些Hibernate映射。 如您所见,映射属性ENV_ID映射了两次。 这样我就可以设置JoinColumn值,而无需查询数据库来获取映射对象,因为此时我有JoinColumn值。 ENV_ID的值被正确地写入数据库,但是如果我稍后查询这个错误实体并尝试获取环境实体,则引用为null。 getEnvironment()返回null。 有什么想法如何实现这一

  • 本文向大家介绍如何使用Java在MongoDB中删除数据库?,包括了如何使用Java在MongoDB中删除数据库?的使用技巧和注意事项,需要的朋友参考一下 MongoDB db.dropDatabase()命令用于删除现有数据库。这将删除当前数据库。如果您未选择任何数据库,则将删除默认(测试)数据库。 语法 在Java中,要删除数据库,首先,使用getDatabase()方法获取所需数据库的对象,

  • 问题内容: 我有一个表X,该表具有一个自动递增的ID列作为其主键。我还有其他表A,B,C和D,它们补充了表X中的信息。每个表都必须包含一个引用表X中ID的列。我已经这样做了,并且在我的代码(Java)中,将每个条目的ID返回到表X并在插入其他表时使用该ID的方法。一切都很好。 现在,建议我将表A,B,C和D上的ID列分配为FOREIGN KEYS,因为“这是正确的做法”。我做到了 现在,从表X中删

  • 前面我们介绍了如何在 MongoDB 中《 创建数据库》,本节我们来介绍一下如何删除 MongoDB 中的数据库。 MongoDB 中删除当前数据库的语法格式如下: db.dropDatabase() 注意:使用 db.dropDatabase() 命令会删除当前数据库,在删除数据库之前您可以使用 db 命令来查看当前数据库的名称。 下面通过示例来演示一下如何删除指定的数据库。 首先,使用 命令来

  • 我想要实现的目标: 当最后一列指示TRUE时,我将向相应的收件人发送一封电子邮件(创建一个按钮并将其分配给脚本) 仅当最后一列指示TRUE时将数据从Sheet1移动/复制到Sheet2 移动到Sheet2的数据将写入新行(追加新行) Sheet1中的数据将被删除,但不会影响Sheet2中的数据。 问题是什么: 数据不会从表1移动到表2 以下是我的代码:

  • 我有三个表,它们与下图相匹配: 我需要从join_表中删除一些数据,其中标签列(表右)和名称列(表左)符合一些条件。 我的解决方案是使用临时表: 我的问题是:有没有其他方法可以在不创建临时表的情况下执行此类删除?