Skip to content

MongoDB 删除集合

MongoDB 提供了删除集合的功能,可以清理不再需要的集合。删除集合会同时删除集合中的所有文档和索引。

删除集合方法

基本语法

javascript
db.collection.drop()

示例

javascript
// 删除 users 集合
db.users.drop()

// 返回 true 表示删除成功
// 返回 false 表示集合不存在

删除前检查

javascript
// 检查集合是否存在
if (db.getCollectionNames().indexOf("users") >= 0) {
    db.users.drop()
    print("集合已删除")
} else {
    print("集合不存在")
}

删除集合特点

删除的内容

  • 集合中的所有文档
  • 集合的所有索引
  • 集合本身

保留的内容

  • 数据库本身
  • 其他集合
  • 数据库用户和权限

性能特点

  • 删除操作非常快(几乎瞬间完成)
  • 不会阻塞其他操作
  • 空间不会立即释放(需要 compact)

删除多个集合

批量删除

javascript
// 要删除的集合列表
var collectionsToDrop = ["temp_logs", "cache_data", "old_records"]

collectionsToDrop.forEach(function(colName) {
    if (db.getCollectionNames().indexOf(colName) >= 0) {
        db.getCollection(colName).drop()
        print("已删除集合:", colName)
    } else {
        print("集合不存在:", colName)
    }
})

删除所有集合(保留数据库)

javascript
// 方法 1:遍历删除
db.getCollectionNames().forEach(function(colName) {
    if (!colName.startsWith("system.")) {
        db.getCollection(colName).drop()
        print("已删除:", colName)
    }
})

// 方法 2:使用循环
var collections = db.getCollectionNames()
for (var i = 0; i < collections.length; i++) {
    var colName = collections[i]
    if (!colName.startsWith("system.")) {
        db[colName].drop()
    }
}

安全删除流程

步骤 1:备份数据

bash
# 导出集合
mongodump --db mydb --collection users --out /backup/

# 或使用 mongoexport
mongoexport --db mydb --collection users --out /backup/users.json

步骤 2:确认信息

javascript
// 查看集合统计
db.users.stats()

// 查看文档数量
db.users.countDocuments()

// 查看索引
db.users.getIndexes()

步骤 3:执行删除

javascript
// 安全删除函数
function safeDropCollection(colName) {
    // 确认集合存在
    if (db.getCollectionNames().indexOf(colName) === -1) {
        print("错误: 集合不存在 -", colName)
        return false
    }
    
    // 获取统计信息
    var stats = db[colName].stats()
    print("集合:", colName)
    print("文档数:", stats.count)
    print("数据大小:", stats.size, "bytes")
    print("索引数:", stats.nindexes)
    
    // 执行删除
    var result = db[colName].drop()
    if (result) {
        print("删除成功:", colName)
        return true
    } else {
        print("删除失败:", colName)
        return false
    }
}

// 使用
safeDropCollection("users")

删除与清空对比

drop() vs deleteMany()

特性drop()deleteMany()
删除内容集合+文档+索引仅文档
速度极快取决于文档数量
索引删除保留
空间释放需要 compact不释放
可恢复性可回滚(事务中)

清空集合(保留结构)

javascript
// 方法 1:deleteMany
db.users.deleteMany({})

// 方法 2:remove(已弃用)
db.users.remove({})

命令行删除

非交互式删除

bash
# 直接执行
mongosh --eval "db.getSiblingDB('mydb').users.drop()"

# 带认证
mongosh -u admin -p --authenticationDatabase admin --eval "db.getSiblingDB('mydb').users.drop()"

脚本删除

bash
#!/bin/bash
# drop-collection.sh

DB_NAME=$1
COLLECTION_NAME=$2

if [ -z "$DB_NAME" ] || [ -z "$COLLECTION_NAME" ]; then
    echo "用法: $0 <数据库名> <集合名>"
    exit 1
fi

# 备份
echo "备份集合..."
mongodump --db $DB_NAME --collection $COLLECTION_NAME --out /backup/

# 删除
echo "删除集合..."
mongosh --eval "db.getSiblingDB('$DB_NAME').$COLLECTION_NAME.drop()"

echo "完成"

常见问题

Q: 删除后空间没有释放?

A: 使用 compact 命令释放空间:

javascript
// 压缩数据库
db.runCommand({ compact: "users" })

Q: 误删了集合如何恢复?

A: 从备份恢复:

bash
mongorestore --db mydb --collection users /backup/mydb/users.bson

Q: 如何删除系统集合?

A: 不建议删除系统集合,但可以使用:

javascript
db.system.indexes.drop()  // 谨慎操作!

总结

删除集合要点:

  • 操作不可逆,删除前务必备份
  • 同时删除集合、文档和索引
  • 空间不会立即释放
  • 比 deleteMany() 更快更彻底

在下一章中,我们将学习 MongoDB 插入文档