~/VibeHandbook
免费 PDF

数据库

mongodb.com

MongoDB

是什么

不妨想象一叠索引卡,每张卡可以记录不同的字段,而不是一张每行都必须有相同列的固定表格。MongoDB 的工作方式就像这叠卡片。它是一个文档数据库,将数据存储为灵活的文档(可以把每个"文档"想成一张卡片),并按集合分组。这些文档以一种叫 BSON 的格式保存,它是 MongoDB 把 (JavaScript 对象表示法,一种用具名字段书写数据的常见方式)转成的二进制形式。它没有刚性的表和行,每个文档可以有自己的结构,这使得快速演进数据模型变得容易。对于数据天然映射为嵌套对象的应用,它是一个流行的选择。

优势

  • 灵活的模式:文档可以各不相同并随时演进,无需迁移。
  • 数据直接映射到应用对象,减少了转换代码。
  • 丰富的查询语言,外加强大的聚合管道。
  • 通过内置分片实现水平扩展。
  • 对嵌套字段和数组字段提供强力支持。

取舍

  • 若缺乏严谨的模式设计,很容易产生不一致的数据。
  • 多文档事务虽然存在,但比关系型存储更为沉重。
  • 连接($lookup)相比 (结构化查询语言)较为受限;数据通常需要反规范化。
  • 反规范化(为减少查找而把同一份数据的副本存放在多个地方)会重复存储数据,并使更新变得复杂。

何时使用

对于内容管理、商品目录、用户资料、事件日志,以及数据不断演进或具有层级结构、文档比规范化表更合适的应用,可以选择 MongoDB。

与 vibe coding 的契合度

在指挥 AI 时,不要让"无模式"变成"无规划"。让 AI 定义清晰的文档结构,并用 JSON Schema 校验或 Mongoose 这类 ODM(对象-文档映射器)来强制执行,包括必填字段和类型。根据访问模式告诉它是该内嵌相关数据,还是通过 id 引用,并为你查询和排序所用的字段添加索引。一个好建议:让 AI 使用参数化的查询对象,也就是绝不要把用户输入的原始字符串拼接成查询。还要让它解释自己在内嵌与引用之间的取舍。这样你就能理解读写和更新的成本。

// 模式校验让文档保持一致
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["email", "createdAt"],
      properties: {
        email:     { bsonType: "string" },
        createdAt: { bsonType: "date" },
        roles:     { bsonType: "array", items: { bsonType: "string" } }
      }
    }
  }
});

db.users.createIndex({ email: 1 }, { unique: true });

// 聚合:按角色统计活跃用户数
db.users.aggregate([
  { $match: { active: true } },
  { $unwind: "$roles" },
  { $group: { _id: "$roles", count: { $sum: 1 } } }
]);