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