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 数据库管理建议 #
- 定期备份:设置自动备份策略
- 监控大小:定期检查数据库大小
- 权限控制:为不同应用创建独立用户
- 命名规范:使用统一命名规范
- 文档管理:记录数据库用途和结构
十二、常见问题 #
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