MongoDB 创建集合
集合是 MongoDB 中文档的容器,类似于关系型数据库中的表,但不需要预定义模式。
创建集合方法
方法一:隐式创建(推荐)
插入文档时自动创建集合:
javascript
use mydb
// 自动创建 users 集合并插入文档
db.users.insertOne({ name: "张三", age: 25 })
// 查看集合列表
show collections方法二:显式创建
使用 createCollection() 方法:
javascript
db.createCollection("users")方法三:带选项创建
javascript
db.createCollection("logs", {
capped: true, // 固定集合
size: 5242880, // 最大大小 5MB
max: 5000 // 最大文档数
})集合选项
常用选项
| 选项 | 类型 | 说明 |
|---|---|---|
| capped | boolean | 是否为固定集合 |
| size | number | 固定集合的最大大小(字节) |
| max | number | 固定集合的最大文档数 |
| validator | object | 文档验证规则 |
| validationLevel | string | 验证级别 |
| validationAction | string | 验证失败时的动作 |
创建验证规则集合
javascript
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: {
bsonType: "string",
description: "用户名必填"
},
email: {
bsonType: "string",
pattern: "^.+@.+$",
description: "邮箱格式不正确"
},
age: {
bsonType: "int",
minimum: 0,
maximum: 150
}
}
}
},
validationLevel: "strict", // strict | moderate
validationAction: "error" // error | warn
})集合命名规则
命名规范
- 不能为空字符串
- 不能包含
\0(空字符) - 不能以
system.开头(系统保留) - 不能包含
$字符 - 建议小写字母,下划线分隔
有效命名
javascript
db.createCollection("users") // ✓
db.createCollection("user_profiles") // ✓
db.createCollection("orders_2024") // ✓无效命名
javascript
db.createCollection("") // ✗ 空字符串
db.createCollection("system.users") // ✗ 系统保留
db.createCollection("my$collection") // ✗ 包含$查看集合
列出所有集合
javascript
show collections
// 或
show tables
// 或
db.getCollectionNames()获取集合统计
javascript
db.users.stats()检查集合是否存在
javascript
// 方法1
db.getCollectionNames().indexOf("users") >= 0
// 方法2
db.users.exists() !== null固定集合(Capped Collection)
特点
- 固定大小,空间用完循环覆盖
- 自动维护插入顺序
- 适合日志、缓存等场景
创建固定集合
javascript
db.createCollection("system_logs", {
capped: true,
size: 104857600, // 100MB
max: 10000 // 最多10000条
})查询固定集合
javascript
// 按插入顺序查询
db.system_logs.find().sort({ $natural: 1 }) // 正序
db.system_logs.find().sort({ $natural: -1 }) // 倒序转换普通集合为固定集合
bash
# 需要导出再导入
mongodump --db mydb --collection logs
mongorestore --db mydb --collection logs_new
# 在 mongosh 中
db.logs.renameCollection("logs_backup")
db.createCollection("logs", { capped: true, size: 10000000 })集合操作示例
完整示例
javascript
use ecommerce
// 1. 创建用户集合
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["username", "email"],
properties: {
username: { bsonType: "string" },
email: { bsonType: "string" },
created_at: { bsonType: "date" }
}
}
}
})
// 2. 创建产品集合
db.createCollection("products")
// 3. 创建订单集合
db.createCollection("orders")
// 4. 创建日志固定集合
db.createCollection("app_logs", {
capped: true,
size: 52428800, // 50MB
max: 50000
})
// 5. 查看所有集合
show collections修改集合
修改验证规则
javascript
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email", "age"],
properties: {
name: { bsonType: "string" },
email: { bsonType: "string" },
age: { bsonType: "int", minimum: 18 }
}
}
},
validationLevel: "moderate"
})集合信息
获取集合详细信息
javascript
// 集合统计
db.users.stats()
// 集合选项
db.getCollectionInfos({ name: "users" })
// 验证规则
db.getCollectionInfos({ name: "users" })[0].options.validator最佳实践
1. 命名规范
javascript
// 推荐
db.user_profiles
db.order_items
db.system_logs
// 不推荐
db.UserProfiles // 大小写混合
db.order-items // 连字符
db.data // 过于笼统2. 集合设计
javascript
// 相关数据放同一集合
db.users // 用户基本信息
db.user_profiles // 用户详细资料(一对一)
// 或者嵌入
db.users = {
basic_info: {...},
profile: {...}
}3. 使用验证
javascript
// 生产环境建议启用验证
db.createCollection("payments", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["amount", "currency", "status"],
properties: {
amount: { bsonType: "decimal" },
currency: { enum: ["CNY", "USD", "EUR"] },
status: { enum: ["pending", "completed", "failed"] }
}
}
}
})总结
创建集合要点:
- 通常使用隐式创建(插入文档时自动创建)
- 固定集合适合日志类数据
- 可以使用验证规则确保数据质量
- 遵循命名规范便于维护
在下一章中,我们将学习 MongoDB 删除集合。