MongoDB集合操作 #
一、集合概述 #
1.1 集合概念 #
集合(Collection)是MongoDB中存储文档的容器,类似于关系型数据库中的表。
text
数据库(Database)
├── users (集合)
│ ├── { _id: 1, name: "John", age: 25 }
│ ├── { _id: 2, name: "Jane", age: 28 }
│ └── { _id: 3, name: "Bob", age: 30 }
├── orders (集合)
│ ├── { _id: 1, userId: 1, amount: 100 }
│ └── { _id: 2, userId: 2, amount: 200 }
└── products (集合)
├── { _id: 1, name: "Product A", price: 99.99 }
└── { _id: 2, name: "Product B", price: 149.99 }
1.2 集合特点 #
| 特点 | 说明 |
|---|---|
| 无模式 | 同一集合中的文档可以有不同字段 |
| 动态创建 | 插入文档时自动创建集合 |
| 命名空间 | 数据库.集合名组成命名空间 |
1.3 集合命名规则 #
| 规则 | 说明 |
|---|---|
| 字符 | 不能包含$、空字符串、null |
| 前缀 | 不能以system.开头 |
| 长度 | 最多255字节 |
| 点号 | 可以使用点号表示命名空间 |
二、创建集合 #
2.1 显式创建 #
javascript
// 创建空集合
db.createCollection("users")
// 输出
// { "ok": 1 }
// 创建带选项的集合
db.createCollection("logs", {
capped: true, // 固定大小集合
size: 5242880, // 5MB
max: 5000 // 最多5000个文档
})
// 创建带验证规则的集合
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之间的整数"
}
}
}
}
})
2.2 隐式创建 #
javascript
// 插入文档时自动创建集合
db.products.insertOne({
name: "Product A",
price: 99.99
})
// 集合products自动创建
show collections
// products
2.3 创建选项 #
javascript
// 完整选项示例
db.createCollection("events", {
capped: true, // 固定大小
size: 10485760, // 10MB
max: 10000, // 最多10000个文档
validator: { ... }, // 验证规则
validationLevel: "strict", // 验证级别
validationAction: "error", // 验证动作
storageEngine: {
wiredTiger: {
configString: "block_compressor=snappy"
}
},
indexOptionDefaults: {
storageEngine: {
wiredTiger: {}
}
},
writeConcern: { w: "majority" }
})
三、查看集合 #
3.1 查看所有集合 #
javascript
// 显示所有集合
show collections
show tables
// 输出示例
// logs
// products
// users
3.2 查看集合详细信息 #
javascript
// 查看集合统计
db.users.stats()
// 输出示例
{
ns: 'mydb.users',
count: 1000,
size: 111000,
avgObjSize: 111,
storageSize: 69632,
nindexes: 2,
totalIndexSize: 131072,
totalSize: 200704,
ok: 1
}
// 以MB为单位显示
db.users.stats({ scale: 1024 * 1024 })
3.3 查看集合选项 #
javascript
// 查看集合选项
db.users.getCollectionOptions()
// 输出示例
{
capped: false,
validator: { ... },
validationLevel: 'strict',
validationAction: 'error'
}
3.4 查看集合索引 #
javascript
// 查看索引
db.users.getIndexes()
// 输出示例
[
{ v: 2, key: { _id: 1 }, name: '_id_' },
{ v: 2, key: { name: 1 }, name: 'name_1' },
{ v: 2, key: { email: 1 }, name: 'email_1', unique: true }
]
3.5 查看集合大小 #
javascript
// 数据大小
db.users.dataSize()
// 存储大小
db.users.storageSize()
// 索引大小
db.users.totalIndexSize()
// 总大小
db.users.totalSize()
四、修改集合 #
4.1 重命名集合 #
javascript
// 重命名集合
db.users.renameCollection("members")
// 重命名到其他数据库
db.users.renameCollection("mydb2.members")
// 强制重命名(如果目标集合存在则删除)
db.users.renameCollection("members", { dropTarget: true })
4.2 修改集合选项 #
javascript
// 启用验证规则
db.runCommand({
collMod: "users",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: { bsonType: "string" },
email: { bsonType: "string" }
}
}
},
validationLevel: "strict",
validationAction: "error"
})
// 禁用验证规则
db.runCommand({
collMod: "users",
validator: {},
validationLevel: "off"
})
4.3 修改固定集合 #
javascript
// 修改固定集合大小
db.runCommand({
collMod: "logs",
capped: true,
size: 10485760 // 10MB
})
4.4 添加集合选项 #
javascript
// 添加文档过期时间(TTL索引)
db.logs.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 3600 } // 1小时后删除
)
// 修改TTL时间
db.runCommand({
collMod: "logs",
index: {
keyPattern: { createdAt: 1 },
expireAfterSeconds: 7200 // 改为2小时
}
})
五、删除集合 #
5.1 删除集合 #
javascript
// 删除集合
db.users.drop()
// 输出
// true
// 验证删除
show collections
5.2 删除集合中的所有文档 #
javascript
// 删除所有文档(保留集合和索引)
db.users.deleteMany({})
// 更高效的方式(删除索引)
db.users.drop()
db.createCollection("users")
5.3 删除集合注意事项 #
javascript
// 删除前确认
show collections
// 删除
db.temp_collection.drop()
// 验证
show collections
六、固定集合 #
6.1 创建固定集合 #
javascript
// 创建固定大小集合
db.createCollection("logs", {
capped: true,
size: 5242880, // 5MB
max: 5000 // 最多5000个文档
})
// 创建固定大小集合(只限制大小)
db.createCollection("events", {
capped: true,
size: 10485760 // 10MB
})
6.2 固定集合特点 #
| 特点 | 说明 |
|---|---|
| 固定大小 | 达到限制后自动删除最旧文档 |
| 顺序插入 | 文档按插入顺序存储 |
| 高性能 | 插入和查询性能优异 |
| 不能删除 | 不能删除单个文档 |
| 不能更新 | 更新不能导致文档变大 |
6.3 固定集合操作 #
javascript
// 检查是否为固定集合
db.logs.isCapped()
// 转换为固定集合
db.runCommand({
convertToCapped: "users",
size: 10485760
})
// 查询固定集合
db.logs.find().sort({ $natural: -1 }).limit(10) // 最新10条
6.4 固定集合使用场景 #
javascript
// 日志存储
db.createCollection("system_logs", {
capped: true,
size: 104857600 // 100MB
})
// 事件流
db.createCollection("events", {
capped: true,
size: 52428800, // 50MB
max: 100000
})
// 消息队列
db.createCollection("messages", {
capped: true,
size: 10485760 // 10MB
})
七、文档验证 #
7.1 JSON Schema验证 #
javascript
// 创建带验证规则的集合
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email", "age"],
properties: {
name: {
bsonType: "string",
minLength: 2,
maxLength: 50,
description: "姓名,2-50字符"
},
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"
},
status: {
enum: ["active", "inactive", "pending"],
description: "状态"
},
address: {
bsonType: "object",
properties: {
city: { bsonType: "string" },
street: { bsonType: "string" },
zipCode: { bsonType: "string" }
}
},
tags: {
bsonType: "array",
items: { bsonType: "string" },
description: "标签数组"
}
}
}
}
})
7.2 查询表达式验证 #
javascript
// 使用查询表达式验证
db.createCollection("orders", {
validator: {
$and: [
{ amount: { $gt: 0 } },
{ status: { $in: ["pending", "completed", "cancelled"] } },
{ userId: { $type: "objectId" } }
]
}
})
7.3 验证级别 #
javascript
// strict:所有插入和更新都验证(默认)
db.runCommand({
collMod: "users",
validationLevel: "strict"
})
// moderate:只验证现有文档的更新
db.runCommand({
collMod: "users",
validationLevel: "moderate"
})
// off:关闭验证
db.runCommand({
collMod: "users",
validationLevel: "off"
})
7.4 验证动作 #
javascript
// error:验证失败返回错误(默认)
db.runCommand({
collMod: "users",
validationAction: "error"
})
// warn:验证失败记录警告
db.runCommand({
collMod: "users",
validationAction: "warn"
})
7.5 验证示例 #
javascript
// 插入有效文档
db.users.insertOne({
name: "John",
email: "john@example.com",
age: NumberInt(25),
status: "active"
})
// 成功
// 插入无效文档
db.users.insertOne({
name: "J", // 太短
email: "invalid-email", // 无效邮箱
age: NumberInt(200) // 超出范围
})
// 报错:Document failed validation
八、视图 #
8.1 创建视图 #
javascript
// 创建视图
db.createView(
"activeUsers", // 视图名称
"users", // 源集合
[
{ $match: { status: "active" } },
{ $project: { name: 1, email: 1, age: 1 } }
]
)
// 使用聚合管道创建视图
db.createView(
"orderSummary",
"orders",
[
{ $group: {
_id: "$userId",
totalOrders: { $sum: 1 },
totalAmount: { $sum: "$amount" }
}}
]
)
8.2 查看视图 #
javascript
// 查看所有集合和视图
show collections
// 查看视图定义
db.getCollectionInfos({ name: "activeUsers" })
// 查询视图
db.activeUsers.find()
8.3 删除视图 #
javascript
// 删除视图
db.activeUsers.drop()
8.4 视图限制 #
| 限制 | 说明 |
|---|---|
| 只读 | 不能插入、更新、删除 |
| 无索引 | 使用源集合的索引 |
| 无验证 | 不支持文档验证 |
| 嵌套限制 | 视图不能嵌套视图 |
九、集合管理 #
9.1 集合压缩 #
javascript
// 压缩集合(回收空间)
db.runCommand({ compact: "users" })
// 带选项压缩
db.runCommand({
compact: "users",
force: true // 强制执行
})
9.2 集合验证 #
javascript
// 验证集合
db.users.validate()
// 完整验证
db.users.validate({ full: true })
// 输出示例
{
ns: 'mydb.users',
nrecords: 1000,
nIndexes: 2,
keysPerIndex: { _id_: 1000, name_1: 1000 },
valid: true,
errors: []
}
9.3 集合统计 #
javascript
// 详细统计
db.users.aggregate([
{ $collStats: { latencyStats: { histograms: true } } }
])
// 输出示例
{
ns: 'mydb.users',
count: 1000,
size: 111000,
storageSize: 69632,
totalIndexSize: 131072,
latencyStats: {
reads: { latency: 1234, ops: 100 },
writes: { latency: 5678, ops: 50 },
commands: { latency: 90, ops: 10 }
}
}
十、集合性能 #
10.1 查看执行计划 #
javascript
// 查看查询执行计划
db.users.find({ name: "John" }).explain()
// 详细执行计划
db.users.find({ name: "John" }).explain("executionStats")
// 全部信息
db.users.find({ name: "John" }).explain("allPlansExecution")
10.2 集合索引优化 #
javascript
// 查看索引使用情况
db.users.aggregate([
{ $indexStats: {} }
])
// 输出示例
{
name: 'name_1',
accesses: { ops: 1000, since: ISODate("...") },
usage: { read: 800, write: 200 }
}
10.3 集合大小优化 #
javascript
// 查看集合大小
db.users.stats()
// 压缩集合
db.runCommand({ compact: "users" })
// 重建索引
db.users.reIndex()
十一、最佳实践 #
11.1 集合命名 #
javascript
// 推荐
db.users // 小写,复数形式
db.order_items // 下划线分隔
db.log_2024_01 // 时间分区
// 不推荐
db.Users // 大写
db.order-items // 连字符
db.user // 单数形式
11.2 集合设计 #
text
集合设计原则
1. 相关数据放在一起
├── users (用户信息)
├── orders (订单信息)
└── products (产品信息)
2. 避免过度嵌套
├── 推荐:2-3层嵌套
└── 避免:5层以上嵌套
3. 考虑查询模式
├── 频繁查询的字段建立索引
└── 大文档考虑拆分
11.3 文档验证建议 #
javascript
// 使用JSON Schema验证
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: { bsonType: "string" },
email: { bsonType: "string" }
}
}
},
validationLevel: "strict",
validationAction: "error"
})
十二、常见问题 #
12.1 集合创建失败 #
javascript
// 原因:集合已存在
db.createCollection("users")
// 报错:Collection already exists
// 解决:先检查是否存在
if (db.getCollectionNames().includes("users")) {
print("集合已存在")
} else {
db.createCollection("users")
}
12.2 集合删除失败 #
javascript
// 原因:权限不足
db.users.drop()
// 报错:not authorized
// 解决:使用有权限的用户
use admin
db.auth("admin", "password")
use mydb
db.users.drop()
12.3 固定集合无法删除文档 #
javascript
// 固定集合不支持deleteOne/deleteMany
db.logs.deleteOne({ _id: 1 })
// 报错:cannot remove from a capped collection
// 解决:使用普通集合或重建集合
db.logs.drop()
db.createCollection("logs", { capped: true, size: 5242880 })
十三、总结 #
集合操作速查表:
| 操作 | 命令 |
|---|---|
| 创建集合 | db.createCollection(“name”) |
| 查看集合 | show collections |
| 删除集合 | db.collection.drop() |
| 重命名 | db.collection.renameCollection(“newname”) |
| 集合统计 | db.collection.stats() |
| 验证集合 | db.collection.validate() |
下一步,让我们学习文档操作!
最后更新:2026-03-27