Amazon DocumentDB 集合操作 #
一、集合概述 #
1.1 集合概念 #
text
DocumentDB集合:
├── 文档的逻辑分组容器
├── 类似关系数据库的表
├── 无固定模式(Schema-less)
├── 支持文档验证规则
└── 自动创建默认索引(_id)
1.2 集合命名规则 #
text
命名规则:
├── 不能包含:$ 或 null字符
├── 不能以"system."开头
├── 不能包含点号(嵌套除外)
├── 长度限制:120字节
├── 区分大小写
└── 建议:使用复数形式、小写字母
二、创建集合 #
2.1 显式创建 #
javascript
// 基本创建
db.createCollection("users")
// 输出
{ "ok": 1 }
// 带选项创建
db.createCollection("logs", {
capped: false,
autoIndexId: true
})
2.2 隐式创建 #
javascript
// 插入文档时自动创建集合
db.products.insertOne({
name: "商品A",
price: 99.99
})
// 集合自动创建
show collections
// 输出包含 products
2.3 创建带验证规则的集合 #
javascript
// 使用JSON Schema验证
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: {
bsonType: "string",
description: "必须为字符串类型"
},
email: {
bsonType: "string",
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
description: "必须为有效的邮箱地址"
},
age: {
bsonType: "int",
minimum: 0,
maximum: 150,
description: "必须为0-150之间的整数"
},
role: {
enum: ["user", "admin", "guest"],
description: "只能是user、admin或guest"
}
}
}
},
validationLevel: "strict",
validationAction: "error"
})
2.4 验证规则选项 #
text
validationLevel:
├── strict:所有插入和更新都验证
├── moderate:仅验证符合现有规则的文档
└── off:禁用验证
validationAction:
├── error:拒绝无效文档
└── warn:允许但记录警告
三、查看集合 #
3.1 列出所有集合 #
javascript
// 显示所有集合
show collections
// 或使用函数
db.getCollectionNames()
// 输出示例
[
"users",
"products",
"orders",
"logs"
]
3.2 查看集合详情 #
javascript
// 集合统计信息
db.users.stats()
// 输出
{
"ns": "mydb.users",
"count": 1000,
"size": 128000,
"avgObjSize": 128,
"storageSize": 256000,
"nindexes": 2,
"totalIndexSize": 65536,
"indexSizes": {
"_id_": 32768,
"email_1": 32768
}
}
// 简化统计
db.users.stats({ scale: 1024 }) // 以KB为单位
3.3 查看集合选项 #
javascript
// 查看集合选项
db.users.getCollectionInfos()
// 输出
[
{
"name": "users",
"type": "collection",
"options": {
"validator": { ... }
},
"info": {
"readOnly": false
}
}
]
3.4 查看验证规则 #
javascript
// 获取验证规则
db.getCollectionInfos({ name: "users" })[0].options.validator
四、修改集合 #
4.1 添加验证规则 #
javascript
// 为现有集合添加验证规则
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: { bsonType: "string" },
email: { bsonType: "string" }
}
}
},
validationLevel: "strict",
validationAction: "error"
})
4.2 修改验证规则 #
javascript
// 更新验证规则
db.runCommand({
collMod: "users",
validator: {
$or: [
{ phone: { $type: "string" } },
{ email: { $regex: /@/ } }
]
}
})
4.3 移除验证规则 #
javascript
// 禁用验证
db.runCommand({
collMod: "users",
validator: {},
validationLevel: "off"
})
4.4 重命名集合 #
javascript
// 重命名集合
db.users.renameCollection("customers")
// 跨数据库重命名(DocumentDB不支持)
// 需要手动导出导入
五、删除集合 #
5.1 删除单个集合 #
javascript
// 删除集合
db.users.drop()
// 输出
true // 删除成功
false // 集合不存在
// 删除前检查
if (db.users.countDocuments({}) === 0) {
db.users.drop();
}
5.2 批量删除集合 #
javascript
// 删除所有匹配的集合
db.getCollectionNames().forEach(function(name) {
if (name.startsWith("temp_")) {
db[name].drop();
print("Dropped: " + name);
}
});
5.3 删除注意事项 #
text
删除前检查:
├── 确认集合名称
├── 检查是否有重要数据
├── 确认索引依赖
├── 检查应用引用
└── 确认权限
六、集合索引管理 #
6.1 查看索引 #
javascript
// 查看集合索引
db.users.getIndexes()
// 输出
[
{
"v": 2,
"key": { "_id": 1 },
"name": "_id_"
},
{
"v": 2,
"key": { "email": 1 },
"name": "email_1",
"unique": true
}
]
6.2 创建索引 #
javascript
// 创建单字段索引
db.users.createIndex({ email: 1 })
// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })
// 创建唯一索引
db.users.createIndex(
{ email: 1 },
{ unique: true }
)
// 创建稀疏索引
db.users.createIndex(
{ nickname: 1 },
{ sparse: true }
)
// 创建文本索引
db.articles.createIndex(
{ content: "text" }
)
6.3 删除索引 #
javascript
// 删除指定索引
db.users.dropIndex("email_1")
// 删除所有索引(保留_id)
db.users.dropIndexes()
// 删除多个索引
db.users.dropIndexes(["email_1", "name_1"])
七、集合数据操作 #
7.1 批量插入 #
javascript
// 批量插入
db.users.insertMany([
{ name: "用户1", email: "user1@example.com" },
{ name: "用户2", email: "user2@example.com" },
{ name: "用户3", email: "user3@example.com" }
])
7.2 批量更新 #
javascript
// 批量更新
db.users.updateMany(
{ status: "pending" },
{ $set: { status: "active" } }
)
7.3 批量删除 #
javascript
// 批量删除
db.users.deleteMany({
createdAt: { $lt: new Date("2023-01-01") }
})
八、集合性能优化 #
8.1 分析查询性能 #
javascript
// 使用explain分析查询
db.users.find({ email: "test@example.com" }).explain("executionStats")
// 输出关键信息
{
"executionStats": {
"totalDocsExamined": 1,
"totalKeysExamined": 1,
"executionTimeMillis": 0,
"indexUsed": "email_1"
}
}
8.2 索引优化 #
javascript
// 查看索引使用情况
db.users.aggregate([
{ $indexStats: {} }
])
// 输出
{
"name": "email_1",
"accesses": {
"ops": 1000,
"since": ISODate("2024-01-01T00:00:00Z")
}
}
8.3 存储优化 #
javascript
// 查看存储统计
db.users.stats()
// 整理集合(减少碎片)
db.runCommand({ compact: "users" })
九、集合验证规则详解 #
9.1 JSON Schema验证 #
javascript
// 完整的验证规则示例
db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price", "category"],
properties: {
_id: {
bsonType: "objectId"
},
name: {
bsonType: "string",
minLength: 1,
maxLength: 100,
description: "产品名称,1-100字符"
},
price: {
bsonType: "decimal",
minimum: 0,
exclusiveMinimum: true,
description: "价格必须大于0"
},
category: {
enum: ["electronics", "clothing", "food", "other"],
description: "产品类别"
},
tags: {
bsonType: "array",
items: {
bsonType: "string"
},
minItems: 0,
maxItems: 10,
description: "标签数组,最多10个"
},
stock: {
bsonType: "object",
required: ["quantity", "warehouse"],
properties: {
quantity: {
bsonType: "int",
minimum: 0
},
warehouse: {
bsonType: "string"
}
}
},
metadata: {
bsonType: "object",
additionalProperties: true
}
},
additionalProperties: false
}
}
})
9.2 查询表达式验证 #
javascript
// 使用查询表达式验证
db.createCollection("orders", {
validator: {
$and: [
{ orderDate: { $type: "date" } },
{ totalAmount: { $gte: 0 } },
{
$or: [
{ status: "pending" },
{ status: "completed" },
{ status: "cancelled" }
]
}
]
}
})
9.3 验证错误处理 #
javascript
// 验证失败示例
try {
db.products.insertOne({
name: "产品A",
price: -10, // 违反minimum规则
category: "electronics"
});
} catch (error) {
print("验证失败: " + error.message);
}
// 使用warn模式
db.runCommand({
collMod: "products",
validationAction: "warn"
})
// 无效文档会被插入,但记录警告
十、集合最佳实践 #
10.1 命名约定 #
text
命名建议:
├── 使用复数形式
├── 使用小写字母
├── 使用下划线分隔
├── 使用有意义的名称
└── 保持命名一致性
示例:
├── users(用户集合)
├── products(产品集合)
├── order_items(订单项集合)
└── user_sessions(用户会话集合)
10.2 模式设计 #
text
设计原则:
├── 根据访问模式设计
├── 避免过度嵌套
├── 考虑查询性能
├── 平衡冗余和规范化
└── 考虑数据增长
10.3 索引策略 #
text
索引建议:
├── 为常用查询字段创建索引
├── 复合索引注意字段顺序
├── 避免过多索引
├── 定期监控索引使用
└── 删除未使用的索引
十一、常见问题 #
11.1 集合创建失败 #
javascript
// 问题:集合已存在
// 解决:先检查再创建
if (!db.getCollectionNames().includes("users")) {
db.createCollection("users");
}
11.2 验证规则过于严格 #
javascript
// 问题:现有数据不符合新规则
// 解决:使用moderate级别
db.runCommand({
collMod: "users",
validator: { ... },
validationLevel: "moderate"
})
11.3 索引创建超时 #
javascript
// 问题:大数据量索引创建超时
// 解决:后台创建
db.users.createIndex(
{ name: 1 },
{ background: true }
)
十二、总结 #
12.1 集合操作速查 #
| 操作 | 命令 |
|---|---|
| 创建集合 | db.createCollection(“name”) |
| 查看集合 | show collections |
| 删除集合 | db.collection.drop() |
| 重命名 | db.collection.renameCollection(“newname”) |
| 查看统计 | db.collection.stats() |
| 查看索引 | db.collection.getIndexes() |
| 创建索引 | db.collection.createIndex({field: 1}) |
| 删除索引 | db.collection.dropIndex(“name”) |
12.2 最佳实践总结 #
text
关键要点:
├── 合理命名集合
├── 使用验证规则保证数据质量
├── 优化索引策略
├── 监控集合性能
└── 定期维护
下一步,让我们学习文档插入!
最后更新:2026-03-27