~/VibeHandbook
$39

数据库

mongodb.com

MongoDB

是什么

MongoDB 是一个文档数据库,它将数据存储为灵活的、类 JSON 的文档(BSON),并按集合分组。它没有刚性的表和行,每个文档可以有自己的结构,这使得快速演进数据模型变得容易。对于数据天然映射为嵌套对象的应用,它是一个流行的选择。

优势

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

取舍

  • 若缺乏严谨的模式设计,很容易产生不一致的数据。
  • 多文档事务虽然存在,但比关系型存储更为沉重。
  • 连接($lookup)相比 SQL 较为受限;数据通常需要反规范化。
  • 反规范化会重复存储数据,并使更新变得复杂。

何时使用

对于内容管理、商品目录、用户资料、事件日志,以及数据不断演进或具有层级结构、文档比规范化表更合适的应用,可以选择 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 } } }
]);