Amazon DocumentDB 数据库操作 #
一、数据库概述 #
1.1 数据库概念 #
text
DocumentDB数据库:
├── 文档的逻辑分组容器
├── 包含多个集合
├── 独立的权限控制
├── 独立的索引空间
└── 首次写入时创建
1.2 数据库命名规则 #
text
命名规则:
├── 不能包含:/\. "$*<>:|?
├── 不能以"system."开头
├── 长度限制:64字节
├── 区分大小写
└── 建议:小写字母、数字、下划线
二、创建数据库 #
2.1 隐式创建 #
javascript
// DocumentDB在首次插入数据时创建数据库
use mydb
// 此时数据库还未创建
show dbs // 不会显示mydb
// 插入数据后数据库创建
db.users.insertOne({ name: "张三" })
// 现在可以看到数据库
show dbs
2.2 创建集合触发创建 #
javascript
// 通过创建集合触发数据库创建
use ecommerce
db.createCollection("products")
show dbs
// 输出
// admin 0.000GB
// ecommerce 0.000GB
// local 0.000GB
2.3 批量创建 #
javascript
// 批量插入触发创建
use analytics
db.events.insertMany([
{ type: "click", timestamp: new Date() },
{ type: "view", timestamp: new Date() },
{ type: "purchase", timestamp: new Date() }
])
三、查看数据库 #
3.1 列出所有数据库 #
javascript
// 显示所有数据库
show dbs
// 输出示例
admin 0.000GB
config 0.000GB
local 0.000GB
mydb 0.001GB
ecommerce 0.002GB
// 使用admin命令
db.adminCommand("listDatabases")
// 输出详细信息
{
"databases": [
{ "name": "admin", "sizeOnDisk": 32768, "empty": false },
{ "name": "config", "sizeOnDisk": 16384, "empty": false },
{ "name": "local", "sizeOnDisk": 8192, "empty": false },
{ "name": "mydb", "sizeOnDisk": 1048576, "empty": false }
],
"totalSize": 1101004,
"ok": 1
}
3.2 查看当前数据库 #
javascript
// 显示当前数据库
db
// 或
db.getName()
// 输出
mydb
3.3 查看数据库统计 #
javascript
// 数据库统计信息
db.stats()
// 输出
{
"db": "mydb",
"collections": 3,
"views": 0,
"objects": 1000,
"avgObjSize": 128,
"dataSize": 128000,
"storageSize": 256000,
"indexes": 5,
"indexSize": 65536,
"totalSize": 321536
}
// 指定缩放因子
db.stats(1024 * 1024) // 以MB为单位
四、切换数据库 #
4.1 基本切换 #
javascript
// 切换到指定数据库
use mydb
// 切换到admin数据库
use admin
// 切换到不存在的数据库(允许)
use newdb
4.2 编程方式切换 #
javascript
// Node.js
const client = new MongoClient(uri);
await client.connect();
const db1 = client.db('mydb');
const db2 = client.db('admin');
// Python
client = MongoClient(uri)
db1 = client['mydb']
db2 = client.admin
4.3 跨数据库操作 #
javascript
// 从另一个数据库引用集合
db.getSiblingDB('admin').system.users.find()
// 跨数据库查询
const adminDb = db.getSiblingDB('admin');
adminDb.system.version.find();
五、删除数据库 #
5.1 删除当前数据库 #
javascript
// 切换到要删除的数据库
use testdb
// 删除当前数据库
db.dropDatabase()
// 输出
{ "dropped": "testdb", "ok": 1 }
5.2 删除指定数据库 #
javascript
// 使用admin命令删除
db.adminCommand({
dropDatabase: 1,
writeConcern: { w: "majority" }
})
// 通过getSiblingDB
db.getSiblingDB('testdb').dropDatabase()
5.3 删除注意事项 #
text
删除前检查:
├── 确认数据库名称
├── 检查是否有重要数据
├── 确认备份状态
├── 检查应用依赖
└── 确认权限
六、数据库权限管理 #
6.1 创建用户 #
javascript
// 切换到目标数据库
use mydb
// 创建用户
db.createUser({
user: "appuser",
pwd: "securePassword123",
roles: [
{ role: "readWrite", db: "mydb" }
]
})
// 创建管理员用户
use admin
db.createUser({
user: "admin",
pwd: "adminPassword123",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
})
6.2 内置角色 #
| 角色 | 权限 |
|---|---|
| read | 读取数据 |
| readWrite | 读写数据 |
| dbAdmin | 数据库管理 |
| userAdmin | 用户管理 |
| dbOwner | 数据库所有者 |
6.3 查看用户 #
javascript
// 查看当前数据库用户
db.getUsers()
// 查看指定用户
db.getUser("appuser")
// 查看所有用户(admin数据库)
use admin
db.system.users.find()
6.4 更新用户 #
javascript
// 修改密码
db.updateUser("appuser", {
pwd: "newPassword123"
})
// 添加角色
db.grantRolesToUser("appuser", [
{ role: "dbAdmin", db: "mydb" }
])
// 移除角色
db.revokeRolesFromUser("appuser", [
{ role: "dbAdmin", db: "mydb" }
])
6.5 删除用户 #
javascript
// 删除用户
db.dropUser("appuser")
// 删除所有用户(当前数据库)
db.dropAllUsers()
七、数据库配置 #
7.1 参数组配置 #
bash
# 使用AWS CLI创建参数组
aws docdb create-db-cluster-parameter-group \
--db-cluster-parameter-group-name custom-params \
--db-parameter-group-family docdb5.0 \
--description "Custom parameter group"
# 修改参数
aws docdb modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name custom-params \
--parameters "ParameterName=tls,ParameterValue=enabled,ApplyMethod=immediate"
7.2 常用参数 #
| 参数 | 说明 | 默认值 |
|---|---|---|
| tls | TLS加密 | enabled |
| audit_logs | 审计日志 | disabled |
| profiler | 性能分析 | disabled |
| slow_op_threshold_ms | 慢查询阈值 | 100 |
八、数据库监控 #
8.1 性能指标 #
javascript
// 服务器状态
db.serverStatus()
// 关键指标
{
"connections": {
"current": 10,
"available": 990
},
"opcounters": {
"insert": 100,
"query": 500,
"update": 50,
"delete": 10
},
"network": {
"bytesIn": 1048576,
"bytesOut": 2097152
}
}
8.2 当前操作 #
javascript
// 查看当前操作
db.currentOp()
// 查看长时间运行的操作
db.currentOp({
"secs_running": { $gt: 5 }
})
// 终止操作
db.killOp(12345)
8.3 CloudWatch监控 #
text
CloudWatch指标:
├── CPUUtilization
├── FreeableMemory
├── DatabaseConnections
├── ReadIOPS
├── WriteIOPS
├── ReadLatency
├── WriteLatency
└── NetworkThroughput
九、数据库最佳实践 #
9.1 命名约定 #
text
命名建议:
├── 使用小写字母
├── 使用下划线分隔
├── 使用有意义的名称
├── 避免使用保留字
└── 保持命名一致性
示例:
├── 用户数据库:user_db
├── 产品数据库:product_db
├── 日志数据库:log_db
└── 分析数据库:analytics_db
9.2 数据库规划 #
text
规划考虑:
├── 按业务领域划分
├── 考虑数据隔离需求
├── 评估数据量增长
├── 规划备份策略
└── 设计权限模型
9.3 安全建议 #
text
安全措施:
├── 启用认证
├── 使用最小权限原则
├── 定期轮换密码
├── 启用TLS加密
├── 配置VPC隔离
└── 启用审计日志
十、常见问题 #
10.1 数据库未显示 #
javascript
// 问题:use命令后show dbs不显示
// 原因:数据库在首次写入时才创建
// 解决:插入数据
use newdb
db.test.insertOne({})
// 现在可以看到了
show dbs
10.2 删除后空间未释放 #
text
说明:
├── DocumentDB不会立即释放空间
├── 空间会被标记为可重用
├── 后续写入会优先使用
└── 可通过compact命令整理
10.3 连接数过多 #
javascript
// 查看连接数
db.serverStatus().connections
// 解决方案
// 1. 使用连接池
// 2. 检查连接泄漏
// 3. 增加实例规格
十一、总结 #
11.1 数据库操作速查 #
| 操作 | 命令 |
|---|---|
| 创建数据库 | use dbname + insert |
| 查看数据库 | show dbs |
| 切换数据库 | use dbname |
| 删除数据库 | db.dropDatabase() |
| 查看统计 | db.stats() |
| 创建用户 | db.createUser() |
| 查看用户 | db.getUsers() |
11.2 最佳实践总结 #
text
关键要点:
├── 合理规划数据库
├── 使用有意义的命名
├── 配置适当的权限
├── 启用安全特性
├── 监控性能指标
└── 定期备份
下一步,让我们学习集合操作!
最后更新:2026-03-27