跳至主要内容

在 MongoDB 中创建集合:手动与自动方法

了解 MongoDB 中集合的创建方式、何时应显式定义,以及关键配置选项。
· 5分钟 阅读

使用 AI 探索

当您使用 MongoDB,尤其是从关系型数据库转过来的开发者时,首先会注意到的一点就是其架构设计的高度灵活。

MongoDB 中的集合无需事先显式创建,但在某些情况下,提前明确定义并细致配置会更合适。

本文将介绍在 MongoDB 中如何以及何时创建集合、需要考虑的一些关键配置选项,并提供 JS 和 C#(我的最爱)的代码示例。

别担心,各驱动之间的特性有很高的一致性,因此您今天在此看到的多数内容,也都可以在 <insert your language of choice> 中实现。

如果您刚接触 NoSQL 数据库,不妨先从 Introduction to NoSQL开始。

什么是 MongoDB 集合?

在了解如何创建集合之前,我们先简要讨论一下集合究竟是什么。

如果您来自 SQL 背景,可能更熟悉表、行和列。在 MongoDB 中,术语稍有不同:我们使用集合(而非表),使用包含字段的文档(而非行和列)。

MongoDB 的一大超能力是其动态架构。这意味着您无需在使用前手动创建集合。如果您向一个尚不存在的集合插入文档,MongoDB 会自动创建它。例如,如果您运行:

db.movies.insertOne({ title: "The Matrix", year: 1999 });

它会尝试向 movies 集合插入一条关于电影“The Matrix”的文档。如果该集合已存在,文档会被添加进去;如果不存在,则会先创建 movies 集合,然后再添加新文档。

您也可以使用 insertMany 一次性添加多条文档,而非 insertOne。

何时应显式定义 MongoDB 集合

尽管您可以让 MongoDB 自动创建集合,但在生产环境中,提前显式定义集合有很多好处。显式创建集合使您能够:

  • 配置用于日志或缓存的固定大小集合(capped collections)。
  • 设置验证规则,以在架构中强制约束。
  • 应用某些默认索引,例如 TTL(存活时间)。这些基于日期字段的索引会按照您指定的时间自动删除集合中的文档。
  • 通过预分配集合大小来优化写入密集型工作负载。

以下是在MongoDB Shell中创建集合的方法:

db.createCollection("auditLogs", {
  capped: true,
  size: 10485760, // 10 MB
  max: 1000
});

或者带有验证:

db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["email", "createdAt"],
      properties: {
        email: {
          bsonType: "string",
          pattern: "^.+@.+$"
        },
        createdAt: {
          bsonType: "date"
        }
      }
    }
  }
});

尽管 MongoDB 支持灵活架构,您可能仍希望添加验证规则,例如必填字段,或对特定字段指定属性(如数据类型或电子邮件格式),就像上面所示。如果您希望确保文档遵循特定架构,这会很有用。

如果您来自 SQL 背景,强制执行架构会让您倍感熟悉;即便不是,有时生产环境下的应用也需要结构可预测的文档。因此,验证在这方面非常出色!

使用 C# 驱动创建 MongoDB 集合

在 C# 应用中,您也可以使用 MongoDB 驱动显式创建集合。虽然基本操作不要求这样做,但这正是您以编程方式设置高级选项的场景。

var options = new CreateCollectionOptions
{
    Capped = true,
    MaxSize = 10485760, // 10 MB
    MaxDocuments = 1000
};

await database.CreateCollectionAsync("auditLogs", options);

添加验证器:

var validator = new BsonDocument
{
    { "$jsonSchema", new BsonDocument
        {
            { "bsonType", "object" },
            { "required", new BsonArray { "email", "createdAt" } },
            { "properties", new BsonDocument
                {
                    { "email", new BsonDocument
                        {
                            { "bsonType", "string" },
                            { "pattern", "^.+@.+$" }
                        }
                    },
                    { "createdAt", new BsonDocument
                        {
                            { "bsonType", "date" }
                        }
                    }
                }
            }
        }
    }
};

var collectionOptions = new CreateCollectionOptions<BsonDocument>
{
    Validator = new BsonDocumentFilterDefinition<BsonDocument>(validator)
};

await database.CreateCollectionAsync("users", collectionOptions);

对 Python 开发者而言, Introduction to MongoDB and Python 教程是很好的资源。

需要了解的关键集合配置选项

当您显式创建集合时,以下选项值得了解:

  • capped:创建固定大小集合
  • size:固定大小集合的最大字节数
  • max:允许的最大文档数量
  • validator:采用架构语法的 JSON 对象,用于定义架构验证
  • expireAfterSeconds:与 TTL 索引配合使用,以自动删除文档

您还可以在创建时或稍后应用索引。除非是 _id 所必需,否则 MongoDB 不会自动创建索引。

MongoDB 中的索引可以提升最常访问字段的性能。它们会将这些值缓存到内存中,意味着无需进行硬盘读取;在经常访问这些字段时,这能显著节省时间并提升性能。

定义 MongoDB 集合的最佳实践

以下是一些指导方针,帮助您判断何时应显式定义集合:

  • 当进行快速概念验证或本地开发,或当终端用户能够动态生成内容时,使用隐式创建
  • 当您希望应用验证,或为索引与性能设置参数时,使用显式创建

总结

MongoDB 以其灵活架构而闻名,这为我们组织数据方式带来灵活性,也包括如何创建和管理集合。隐式创建快捷方便,而显式定义集合则可解锁诸如架构验证、固定大小行为以及性能调优等强大功能。

一如既往,MongoDB Atlas 通过基于 UI 的工具、自动化与内置性能洞察,让集合管理更加轻松。而如果您使用 .NET,C# 驱动提供强类型模型与流式 API,能很好地满足需求。

在考虑定义 MongoDB 集合的最佳实践时,理解基础 database design 原则也会有所裨益。

祝您编码愉快!愿您的集合高速、合规且索引良好!

FAQs

在 MongoDB 中,隐式与显式创建集合有什么区别?
  • 隐式创建:当您向一个不存在的集合插入文档时,MongoDB 会自动创建该集合。这对于快速原型或开发很有用。
  • 显式创建:在使用之前手动定义集合,通常用于配置高级设置,如验证规则、固定大小或索引。生产环境中建议使用此方式。
我应在何时显式创建集合,而不是让 MongoDB 自动创建?

在以下场景应显式创建集合:需要架构验证、固定大小集合、性能优化以及默认索引。

如果 MongoDB 是无架构的,我如何强制执行架构?

MongoDB 支持 JSON 架构验证,您可以借此为文档结构定义规则。

什么是固定大小集合,应在何时使用?

固定大小集合(capped collections)是固定容量的集合,满了之后会自动覆盖旧文档。

如何创建带有 TTL(生存时间)索引的集合?

TTL 索引会在指定时间后自动删除文档。先创建集合,再添加该索引。

Luce Carter

作者

Luce Carter

Luce Carter 是 MongoDB 高级开发者推广布道师、Microsoft MVP、Contentful Dev Hero、《Beginning MongoDB Atlas with .NET》作者,热爱代码、阳光与学习。

主题