【发布时间】:2018-10-31 02:48:09
【问题描述】:
我对 MongoDB 和 MongoDB Compass 非常陌生。
我的客户集合中有大约 1000 条记录。 如何通过 MongoDB 指南针一次删除所有记录。
非常感谢,
【问题讨论】:
-
删除收藏对你有用吗?
我对 MongoDB 和 MongoDB Compass 非常陌生。
我的客户集合中有大约 1000 条记录。 如何通过 MongoDB 指南针一次删除所有记录。
非常感谢,
【问题讨论】:
您可以使用 MongoDB 指南针提供的 Embedded Shell。它现在处于测试模式。我正在使用指南针版本 1.23.0
要删除多条记录,可以使用db.<collectionname>.deleteMany
https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany/
【讨论】:
如果您在该集合上没有索引,您可以删除整个集合,如 docs 所示。
但是,如果您有索引,删除集合也会删除索引,但通常删除整个内容然后重新创建集合和索引比使用 remove 删除所有文档要快得多(db.collection.remove({}) ),因为这将不得不逐个文档地释放它们占用的空间并删除它们在索引上的条目(如果有的话)。
这种方法的唯一警告是,在分片集群中,您可能会删除一个集合,即使报告删除成功,该集合仍可能存在于某些节点中,从而在重新创建它时导致问题。
您可以在https://jira.mongodb.org/browse/SERVER-17397 阅读更多关于这个OPEN 问题及其解决方法的信息:
问题摘要
在分片集群中删除数据库/集合时,即使报告删除成功,数据库/集合仍可能存在于集群中的某些节点中。目前,我们不建议用户删除数据库或集合,然后尝试重用命名空间。
用户影响
当数据库/集合未成功删除到给定节点时,相应的文件将继续使用该节点中的磁盘空间。尝试重用命名空间可能会导致未定义的行为。
解决方法
要解决此问题,可以按照以下步骤在分片环境中删除数据库/集合:
- 使用
mongos删除数据库/集合。- 连接到每个分片的主分片并验证命名空间已被删除。如果还没有,请放弃。删除数据库(例如
db.dropDatabase())会删除磁盘上正在删除的数据库的数据文件。连接到
mongos,切换到config数据库并从集合chunks、locks、databases和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" } )连接到每个
mongos并运行flushRouterConfig。
【讨论】:
db.collection.remove({})逐个文档,这在大集合上是不可行的。