繁体   English   中英

mongoDb Id 如何与存储在磁盘中的文档进行映射

[英]How mongoDb Id is mapped with document stored in disk

每个 Db 都有 Id 的概念,客户端使用 id 来获取存储在磁盘中的文档。 例如 MongoDb 的 id 长 12 字节。 有人可以帮我了解如何使用 id 来定位存储在磁盘中的文档吗? Id 是否与磁盘位置映射是唯一使用的概念,还是在内部还有其他更重要的角色?

感谢大家的时间!

长话短说:博士
_id 值与文档在磁盘上的位置之间没有直接关联。

更长的解释

_id字段是集合中文档的唯一标识符。 它像任何其他用户定义的字段一样与文档一起存储。

MongoDB 使用 WiredTiger 存储引擎将数据写入磁盘。 WiredTiger 为集合中的每个文档分配一个它在内部使用的标识符,但不会公开并且不能直接查询。

WiredTiger 在向磁盘写入文件时,使用了一种以主键为内部标识符的二叉树,页面大小为 32KB。 根页面的当前文件偏移量与数据文件一起记录,根页面包含树中下一页的偏移量,依此类推,直到到达包含文档的叶页面。

_id值记录在文档和索引文件(也是一棵树)中,索引文件映射到文档的内部标识符。

当您通过_id查询文档时,会遍历索引 until 以查找文档的内部 id,然后遍历数据文件以检索文档。

文件中任何页面的确切位置都不是静态的。 在 WiredTiger 中更新数据时,会添加一个新页面,然后复制和更新父页面,包括根页面。 当一个检查点完成时,新根页面的位置被记录下来。

这意味着特定文档在磁盘上的确切位置将在每次更新时发生变化,并且如果碰巧位于树的同一叶页中的任何其他文档被更新时也会发生变化,并且如果集合是压实。

在检查点期间替换页面后,该空间被标记为空闲以供重用,因此当为更新重写时,包含给定文档的叶页可以移向文件的任一端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM