Skip to content

语言: English | 简体中文

MiniMongoDB ↔ MongoDB 映射

Level(级别)列是教学约定的一部分:

  • Equivalent 表示本地机制保留了指定的核心不变量(core invariant),并不 表示其性能或实现与生产系统等同(production-equivalent)。
  • Intentionally simplified 表示方向相同,但接口表面或底层机制更小。
  • Semantically opposite 表示这个微型系统刻意反转了真实系统中的一项重要 选择;绝不要通过类比迁移该行为。
MiniMongoDB 模块 真实 MongoDB 概念/子系统 级别 应迁移的认识
bson.types.ObjectId BSON ObjectId 标识值 语义相反(Semantically opposite) 两者都是 12 字节形态的标识,但真实 ObjectId 会编码时间、进程、随机值和计数器材料;本项目禁用这些来源,只使用一个注入的计数器。
bson.types 字典/列表模型 二进制 BSON 值与比较顺序 有意简化(Intentionally simplified) 值仍带有类型,文档与数组仍彼此有别。支持的类型和跨类型顺序要少得多。
bson.path MQL 点分字段路径 有意简化 嵌套字段和显式数字数组索引共用一种路径表示法;此处拒绝有歧义的稀疏数组创建。
query.matcher 标量与数组的相等判断 MQL 多键匹配行为 等价(Equivalent) 标量谓词无需显式迭代即可匹配已存储数组中的一个元素。
query.matcher 字面量文档相等判断 BSON 嵌入式文档相等判断 等价 字面量嵌入式文档作为完整值比较,包括字段顺序;点分路径选择单个嵌套字段。
query.matcher 范围比较 MQL 比较谓词 语义相反 MongoDB 通常对范围谓词应用类型限定(type bracketing);MiniMongoDB 则跨所有受支持类型公开其全局教学顺序。
query.matcher 顶层 $not 字段级 $not 查询操作符 语义相反 MiniMongoDB 接受项目特有的顶层逻辑 $not;真实 MongoDB 只支持字段操作符 $not,并拒绝顶层形式。
update.operators MQL 更新修饰符 有意简化 替换更新与操作符更新相互分离;路径变更在单文档内具有原子性。不支持操作符选项和数组过滤器。
index.IdIndex 自动创建的唯一 _id_ 索引 等价 每个集合都会在写入可见前按带 BSON 类型的相等语义保证标识唯一。底层使用带规范标签键的 Python 哈希映射,而非 B-tree。
index.SecondaryIndex 升序二级、复合、唯一和 multikey 索引 有意简化 点分字段与 _id 共用带 BSON 标签的 canonical 相等语义;含数组的文档拥有多个去重键。复合扫描要求最左前缀。本地有序映射不是 B-tree,也不实现降序、稀疏、部分或专用索引。
collection.Collection 集合 CRUD 层 有意简化 文档会跨越复制边界,并且仅在日志条目持久化后发布。批量方法提交前缀,而不是充当多文档事务。
oplog.OplogEntry 副本集 oplog 后镜像/幂等规约 有意简化 动作更新变为可安全重复的最终赋值。真实 oplog 格式和各版本专用的更新编码更为丰富。
携带 oplog 帧的 storage.journal WiredTiger 日志加副本 oplog 语义相反 真实 MongoDB 将存储引擎恢复记录与复制 oplog 分离;M1 复用逻辑 oplog 条目作为本地持久化日志。
storage.checkpoint WiredTiger 检查点 有意简化 重启时从快照开始,并应用更新的持久化记录。该快照是带类型标签的全数据库 JSON,没有页或 MVCC。
storage.recovery 启动恢复 等价 只重放 CRC 有效的日志前缀;重复应用已经应用过的后镜像不会造成影响。
plan.choose_plan 查询规划器与 explain 有意简化 前缀兼容索引按候选文档所有权估计选择性;只有 IXSCAN 检查更少文档时才胜过 COLLSCAN。explain 返回 Mongo 术语的胜出 stage 与实际键/文档计数。
aggregate.execute_pipeline 聚合管道执行 有意简化 $match/$project/$group/$sort/$limit 组成文档算子流;group 支持 $sum/$avg/$min/$max/$push。流式与阻塞 stage 边界显式存在,但没有 MongoDB 优化器或分布式管道。
oplog.capped 文档字符串 有界 local.oplog.rs 保留机制 有意简化 接口方向已记录,但有界保留是明确的 M3 工作项。

一次写入如何经过这个微型系统

update_one({"_id": 1}, {"$inc": {"visits": 1}})
  → matcher selects one document
  → update engine mutates an isolated copy
  → immutable _id is validated
  → oplog prepares {"$set": {"visits": <final value>}}
  → journal appends length | payload | CRC and fsyncs
  → oplog publishes its sequence and in-memory entry
  → collection swaps the copy and all indexes atomically

关键的所有权边界(ownership boundary)位于用户命令与持久化条目之间。 命令说明要尝试什么动作;条目说明要收敛到哪个最终状态

关系算子与文档管道

MiniPostgres 把针对 schema 行的 SQL 解析为计划树,Volcano 算子从子节点拉取 tuple。MiniMongoDB 从已经成形的查询文档出发,选择 IXSCANCOLLSCAN, 再让自描述的嵌套文档依次通过聚合 stage。两者都教学算子组合与阻塞边界 (Sort/Aggregate$sort/$group);只有关系侧把列绑定到 schema, 文档侧则把点分路径与 multikey 扇出保留为运行时值语义。