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