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 } } }
]);