如何使用MongoDB指南针在MongoDB中删除集合中选定的多个记录

ani*_*nil 6 mongodb mongodb-compass

我是MongoDB和MongoDB Compass的新手。

我的客户集中有大约1000条记录。如何通过MongoDB指南针一次删除所有记录。

非常感谢,

Tar*_*han 21

您可以使用 MongoDB compass 提供的 Embedded Shell。目前处于测试模式。我使用的是指南针版本1.23.0

带有 Shell 的 MongoDB 指南针

要删除多条记录,可以使用db.<collectionname>.deleteMany
https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany/


Dan*_*ger 1

如果您没有该集合的索引,您可以删除整个集合,如文档中所示

但是,如果有索引,删除集合也会删除索引,但删除整个集合然后重新创建集合和索引通常比使用remove()删除所有文档要快得多db.collection.remove({}),因为这样会逐个文档地释放它们占用的空间并删除索引上的条目(如果有)。

这种方法的唯一警告是,在分片集群中,您可能会删除一个集合,即使报告删除成功,该集合可能仍然存在于某些节点中,从而在重新创建它时导致问题。

您可以在https://jira.mongodb.org/browse/SERVER-17397OPEN阅读有关此问题及其解决方法的更多信息:

问题摘要

在分片集群中删除数据库/集合时,即使报告删除成功,该数据库/集合也可能仍存在于集群中的某些节点中。目前,我们不建议用户删除数据库或集合,然后尝试重用命名空间。

用户影响

当给定节点中的数据库/集合未成功删除时,相应的文件将继续使用该节点中的磁盘空间。尝试重用命名空间可能会导致未定义的行为。

解决方法

要解决此问题,可以按照以下步骤在分片环境中删除数据库/集合:

  1. 使用 删除数据库/集合mongos
  2. 连接到每个分片的主分片并验证命名空间是否已删除。如果还没有,请放弃它。删除数据库(例如db.dropDatabase())会删除磁盘上正在删除的数据库的数据文件。
  3. 连接到 a mongos,切换到config数据库并从集合chunkslocksdatabases中删除对已删除命名空间的所有引用collections

    删除数据库时:

    使用配置
    db.collections.remove( { _id: /^DATABASE\./ } )
    db.databases.remove( { _id: "DATABASE" } )
    db.chunks.remove( { ns: /^DATABASE\./ } )
    db.locks.remove( { _id: /^DATABASE\./ } )
    

    删除集合时:

    使用配置
    db.collections.remove( { _id: "DATABASE.COLLECTION" } )
    db.chunks.remove( { ns: "DATABASE.COLLECTION" } )
    db.locks.remove( { _id: "DATABASE.COLLECTION" } )
    
  4. 连接到每个mongos并运行flushRouterConfig

  • 这个答案与删除 MongoDB Compass 中的记录有关吗?因为这就是OP想要的。如何在 MongoDB Compass 中应用 db.collection.remove({})? (3认同)