<返回目录     Powered by claud/xia兄

第3课: 集合操作

集合操作基础:深入理解MongoDB数据组织

集合是MongoDB中组织数据的基本单位,类似于关系型数据库中的表。本课将深入讲解集合的创建、管理和操作。

集合的基本概念

在MongoDB中,集合具有以下重要特性:

创建集合:显式与隐式创建

MongoDB支持两种创建集合的方式:显式创建和隐式创建。

显式创建集合

// 基本集合创建
db.createCollection("users")

// 创建集合时指定选项
db.createCollection("products", {
    capped: true,           // 固定大小集合
    size: 10485760,         // 10MB大小限制
    max: 5000,              // 最多5000个文档
    autoIndexId: true       // 自动创建_id索引(默认true)
})

// 创建验证规则的集合
db.createCollection("orders", {
    validator: {
        $jsonSchema: {
            bsonType: "object",
            required: ["orderNumber", "customerId", "totalAmount"],
            properties: {
                orderNumber: { bsonType: "string" },
                totalAmount: { bsonType: "decimal" }
            }
        }
    }
})

隐式创建集合

// 当插入文档时,如果集合不存在会自动创建
db.logs.insertOne({
    message: "系统启动",
    level: "info",
    timestamp: new Date()
})

// 验证集合是否创建
show collections  // logs集合会出现在列表中
显式创建 vs 隐式创建:选择指南

两种创建方式各有适用场景:

上限集合(Capped Collection)详解

// 创建上限集合示例
db.createCollection("system_logs", {
    capped: true,
    size: 10485760,    // 10MB
    max: 10000         // 最多10000个文档
})

// 上限集合特性:
// 1. 固定大小,达到限制时自动删除旧文档
// 2. 保持插入顺序,支持高效的顺序读取
// 3. 不支持文档删除和更新(除非更新后文档大小不变)
// 4. 适合日志、缓存等场景

集合命名规范

插入单个文档

// insertOne() - 插入单个文档
db.users.insertOne({
    name: "李四",
    age: 28,
    email: "lisi@example.com",
    hobbies: ["读书", "旅游"],
    address: {
        city: "北京",
        district: "朝阳区"
    },
    createdAt: new Date()
})

// 返回结果包含插入的_id
{
    acknowledged: true,
    insertedId: ObjectId("507f1f77bcf86cd799439011")
}

批量插入文档

// insertMany() - 插入多个文档
db.users.insertMany([
    {
        name: "王五",
        age: 30,
        email: "wangwu@example.com"
    },
    {
        name: "赵六",
        age: 25,
        email: "zhaoliu@example.com"
    },
    {
        name: "孙七",
        age: 35,
        email: "sunqi@example.com"
    }
])

// 返回所有插入的_id
{
    acknowledged: true,
    insertedIds: {
        '0': ObjectId("..."),
        '1': ObjectId("..."),
        '2': ObjectId("...")
    }
}

文档的_id字段

// 手动指定_id
db.users.insertOne({
    _id: "user001",
    name: "自定义ID用户",
    age: 22
})

// ObjectId结构(12字节)
// 4字节时间戳 + 5字节随机值 + 3字节递增计数器

批量插入选项

// ordered: false - 无序插入(遇到错误继续插入)
db.users.insertMany([
    { _id: 1, name: "用户1" },
    { _id: 2, name: "用户2" },
    { _id: 1, name: "重复ID" },  // 会失败
    { _id: 3, name: "用户3" }     // 仍会插入
], { ordered: false })

// ordered: true(默认)- 有序插入(遇到错误停止)
db.users.insertMany([
    { _id: 4, name: "用户4" },
    { _id: 5, name: "用户5" },
    { _id: 4, name: "重复ID" },  // 会失败
    { _id: 6, name: "用户6" }     // 不会插入
], { ordered: true })

查看集合信息

// 查看集合统计信息
db.users.stats()

// 查看集合中的文档数量
db.users.countDocuments()

// 查看集合的存储大小
db.users.storageSize()

// 查看集合的索引
db.users.getIndexes()

重命名集合

// 重命名集合
db.users.renameCollection("customers")

// 验证
show collections

删除集合

// 删除集合及其所有文档
db.users.drop()

// 返回true表示删除成功
true
注意:

drop()会删除集合及其所有索引,操作不可逆!

实战示例

// 创建博客系统的集合
use blog

// 插入文章
db.posts.insertMany([
    {
        title: "MongoDB入门教程",
        author: "张三",
        content: "这是一篇关于MongoDB的教程...",
        tags: ["数据库", "NoSQL", "MongoDB"],
        views: 0,
        likes: 0,
        createdAt: new Date()
    },
    {
        title: "Node.js最佳实践",
        author: "李四",
        content: "分享Node.js开发经验...",
        tags: ["Node.js", "JavaScript"],
        views: 0,
        likes: 0,
        createdAt: new Date()
    }
])

// 插入评论
db.comments.insertOne({
    postId: ObjectId("..."),  // 文章ID
    author: "王五",
    content: "写得很好!",
    createdAt: new Date()
})

// 查看所有集合
show collections
练习题:
  1. 创建一个"library"数据库
  2. 创建books集合,插入5本书的信息(书名、作者、出版年份、价格)
  3. 创建members集合,插入3个会员信息(姓名、会员号、注册日期)
  4. 使用insertMany批量插入10本书
  5. 查看books集合的文档数量
  6. 重命名members集合为readers