MongoDB数据库操作 #

一、数据库概述 #

1.1 数据库概念 #

MongoDB数据库是集合的容器,每个数据库都有独立的权限和存储空间。

text
MongoDB实例
├── admin (系统数据库)
├── local (系统数据库)
├── config (系统数据库)
├── mydb (用户数据库)
│   ├── users (集合)
│   ├── orders (集合)
│   └── products (集合)
└── test (用户数据库)

1.2 系统数据库 #

数据库 说明
admin 管理数据库,存储用户和权限信息
local 存储复制集信息,不会被复制
config 分片集群配置信息

1.3 数据库命名规则 #

规则 说明
字符 只能使用ASCII字母、数字、下划线
大小写 推荐全部小写
长度 最多64字节
保留 admin, local, config是保留数据库

二、创建数据库 #

2.1 使用use命令 #

javascript
// 切换到数据库(如果不存在则创建)
use mydb

// 输出
// switched to db mydb

注意: 数据库在插入第一个文档后才真正创建。

2.2 自动创建 #

javascript
// 切换到新数据库
use newdb

// 此时数据库还未真正创建
show dbs  // 不会显示newdb

// 插入文档后数据库被创建
db.users.insertOne({ name: "John" })

// 现在可以看到数据库
show dbs
// 输出:
// admin   0.000GB
// local   0.000GB
// newdb   0.000GB

2.3 创建集合时创建 #

javascript
// 创建集合时自动创建数据库
use myapp

db.createCollection("users")

show dbs
// 输出:
// admin   0.000GB
// local   0.000GB
// myapp   0.000GB

三、查看数据库 #

3.1 查看所有数据库 #

javascript
// 显示所有数据库
show dbs
show databases

// 输出示例
// admin   0.000GB
// config  0.000GB
// local   0.000GB
// mydb    0.012GB
// test    0.000GB

3.2 查看当前数据库 #

javascript
// 显示当前数据库
db

// 输出
// mydb

3.3 查看数据库统计 #

javascript
// 查看数据库统计信息
db.stats()

// 输出示例
{
    db: 'mydb',
    collections: 3,
    views: 0,
    objects: 1000,
    avgObjSize: 111.0,
    dataSize: 111000,
    storageSize: 69632,
    indexes: 5,
    indexSize: 131072,
    totalSize: 200704,
    scaleFactor: 1,
    fileSize: 0,
    ok: 1
}

3.4 查看数据库大小 #

javascript
// 数据大小
db.stats().dataSize

// 存储大小
db.stats().storageSize

// 索引大小
db.stats().indexSize

// 总大小
db.stats().totalSize

3.5 查看数据库列表(管理命令) #

javascript
// 使用管理命令
db.adminCommand({ listDatabases: 1 })

// 输出示例
{
    databases: [
        { name: 'admin', sizeOnDisk: 32768, empty: false },
        { name: 'config', sizeOnDisk: 16384, empty: false },
        { name: 'local', sizeOnDisk: 32768, empty: false },
        { name: 'mydb', sizeOnDisk: 69632, empty: false }
    ],
    totalSize: 151552,
    ok: 1
}

// 只显示数据库名称
db.adminCommand({ listDatabases: 1, nameOnly: true })

四、切换数据库 #

4.1 使用use命令 #

javascript
// 切换到已存在的数据库
use mydb

// 切换到新数据库(自动创建)
use newdb

// 切换到admin数据库
use admin

// 切换到test数据库
use test

4.2 使用getSiblingDB #

javascript
// 在脚本中切换数据库
db = db.getSiblingDB("mydb")

// 执行跨数据库操作
db.getSiblingDB("admin").system.users.find()

// 在聚合中引用其他数据库
db.getSiblingDB("otherdb").collection.find()

4.3 连接时指定数据库 #

bash
# 连接时指定数据库
mongosh mydb

# 使用连接字符串
mongosh "mongodb://localhost:27017/mydb"

# 带认证连接
mongosh "mongodb://admin:password@localhost:27017/mydb?authSource=admin"

五、删除数据库 #

5.1 删除当前数据库 #

javascript
// 切换到要删除的数据库
use mydb

// 删除当前数据库
db.dropDatabase()

// 输出
// { "dropped": "mydb", "ok": 1 }

5.2 删除指定数据库 #

javascript
// 使用管理命令删除指定数据库
db.getSiblingDB("mydb").dropDatabase()

// 或者
use mydb
db.dropDatabase()

5.3 删除数据库注意事项 #

javascript
// 删除前确认当前数据库
db  // 确保是正确的数据库

// 删除是不可逆操作
db.dropDatabase()

// 验证删除
show dbs

5.4 删除数据库示例 #

javascript
// 创建测试数据库
use testdb

db.users.insertOne({ name: "test" })

show dbs
// testdb   0.000GB

// 删除数据库
db.dropDatabase()
// { "dropped": "testdb", "ok": 1 }

show dbs
// testdb不再显示

六、数据库管理 #

6.1 数据库复制 #

javascript
// 复制数据库(使用聚合)
db.source_collection.aggregate([
    { $out: { db: "target_db", coll: "target_collection" } }
])

// 批量复制集合
db.getCollectionNames().forEach(function(collName) {
    db[collName].aggregate([
        { $out: { db: "newdb", coll: collName } }
    ])
})

6.2 数据库重命名 #

javascript
// MongoDB不支持直接重命名数据库
// 需要复制后删除

// 1. 复制所有集合到新数据库
db.getCollectionNames().forEach(function(collName) {
    db[collName].aggregate([
        { $out: { db: "newdb", coll: collName } }
    ])
})

// 2. 验证新数据库
use newdb
show collections

// 3. 删除旧数据库
use olddb
db.dropDatabase()

6.3 数据库修复 #

javascript
// 修复数据库
db.repairDatabase()

// 输出
// { "ok": 1 }

6.4 数据库压缩 #

javascript
// 压缩所有集合
db.getCollectionNames().forEach(function(collName) {
    db.runCommand({ compact: collName })
})

七、数据库权限 #

7.1 查看数据库用户 #

javascript
// 切换到目标数据库
use mydb

// 查看数据库用户
db.getUsers()

// 查看指定用户
db.getUser("appuser")

7.2 创建数据库用户 #

javascript
// 切换到目标数据库
use mydb

// 创建用户
db.createUser({
    user: "appuser",
    pwd: "password123",
    roles: [
        { role: "readWrite", db: "mydb" }
    ]
})

7.3 数据库角色 #

角色 权限
read 读取数据
readWrite 读写数据
dbAdmin 数据库管理
userAdmin 用户管理
dbOwner 数据库所有者

八、数据库配置 #

8.1 查看数据库配置 #

javascript
// 查看数据库配置
db.adminCommand({ getCmdLineOpts: 1 })

// 查看服务器参数
db.adminCommand({ getParameter: "*" })

8.2 设置数据库参数 #

javascript
// 设置Profiling级别
db.setProfilingLevel(1, 100)

// 查看Profiling状态
db.getProfilingStatus()
// { was: 1, slowms: 100, sampleRate: 1 }

8.3 数据库选项 #

javascript
// 查看数据库选项
db.adminCommand({ listDatabases: 1 })

// 只显示名称
db.adminCommand({ listDatabases: 1, nameOnly: true })

// 显示大小
db.adminCommand({ listDatabases: 1, sizeOnDisk: true })

九、数据库监控 #

9.1 数据库状态 #

javascript
// 数据库统计
db.stats()

// 详细统计
db.stats(1024 * 1024)  // 以MB为单位

// 输出示例
{
    db: 'mydb',
    collections: 5,
    views: 0,
    objects: 10000,
    avgObjSize: 100,
    dataSize: 1000000,      // bytes
    storageSize: 500000,
    indexes: 10,
    indexSize: 200000,
    totalSize: 700000,
    scaleFactor: 1,
    ok: 1
}

9.2 数据库操作统计 #

javascript
// 查看操作统计
db.collection.stats()

// 索引统计
db.collection.aggregate([
    { $indexStats: {} }
])

9.3 当前操作 #

javascript
// 查看当前操作
db.currentOp()

// 查看长时间运行的操作
db.currentOp({
    "active": true,
    "secs_running": { "$gt": 5 }
})

// 终止操作
db.killOp(opid)

十、数据库备份与恢复 #

10.1 使用mongodump #

bash
# 备份单个数据库
mongodump --db mydb --out /backup/

# 备份到压缩文件
mongodump --db mydb --archive=/backup/mydb.gz --gzip

# 备份指定集合
mongodump --db mydb --collection users --out /backup/

10.2 使用mongorestore #

bash
# 恢复数据库
mongorestore --db mydb /backup/mydb/

# 从压缩文件恢复
mongorestore --db mydb --archive=/backup/mydb.gz --gzip

# 恢复指定集合
mongorestore --db mydb --collection users /backup/mydb/users.bson

10.3 导出导入 #

bash
# 导出为JSON
mongoexport --db mydb --collection users --out users.json

# 导出为CSV
mongoexport --db mydb --collection users --type=csv --fields name,email --out users.csv

# 导入JSON
mongoimport --db mydb --collection users --file users.json

# 导入CSV
mongoimport --db mydb --collection users --type=csv --headerline --file users.csv

十一、最佳实践 #

11.1 数据库命名 #

javascript
// 推荐
use my_app_db      // 小写,下划线分隔
use ecommerce      // 小写,单词
use blog_system    // 小写,描述性

// 不推荐
use My-App-DB      // 大写、连字符
use 123db          // 数字开头
use db.test        // 包含特殊字符

11.2 数据库规划 #

text
项目结构建议

单应用
├── app_db (主数据库)
    ├── users
    ├── products
    └── orders

多应用
├── app1_db
├── app2_db
└── shared_db (共享数据)

11.3 数据库管理建议 #

  1. 定期备份:设置自动备份策略
  2. 监控大小:定期检查数据库大小
  3. 权限控制:为不同应用创建独立用户
  4. 命名规范:使用统一命名规范
  5. 文档管理:记录数据库用途和结构

十二、常见问题 #

12.1 数据库不显示 #

javascript
// 原因:数据库为空
use newdb
show dbs  // 不显示newdb

// 解决:插入数据
db.users.insertOne({ name: "test" })
show dbs  // 现在显示newdb

12.2 无法删除数据库 #

javascript
// 原因:权限不足或数据库被占用

// 检查权限
db.getUser("current_user")

// 检查当前操作
db.currentOp()

// 强制删除(谨慎使用)
db.dropDatabase({ force: true })

12.3 数据库大小异常 #

javascript
// 检查数据库统计
db.stats()

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

// 修复数据库
db.repairDatabase()

十三、总结 #

数据库操作速查表:

操作 命令
创建数据库 use dbname
查看数据库 show dbs
切换数据库 use dbname
删除数据库 db.dropDatabase()
查看当前数据库 db
数据库统计 db.stats()

下一步,让我们学习集合操作!

最后更新:2026-03-27