MongoDB 中存储 ObjectId 及其字符串形式的区别

Difference between storing an ObjectId and its string form, in MongoDB

我对 Mongo 数据库对 ObjectId 的使用感到有点困惑。当然,它们非常适合在客户端创建几乎肯定不会与其他客户端创建的 ID 冲突的 ID。但是 mongo 似乎以某种特殊的方式存储它们。存储 id 的字符串表示与将对象 id 存储为对象不同。为什么是这样?

字符串形式的信息与对象形式的信息不一样吗?为什么 mongo 竭尽全力区分这两种形式?例如,当我尝试比较从前端发送的 _id 时,它把我搞砸了。我的数据库与它存储的是字符串形式的 ID 还是对象形式的 ID 完全不一致,虽然我的代码肯定是部分原因,但我主要归咎于 mongo 让这变得如此奇怪。

我错了,这很奇怪吗?为什么 mongo 这样做?

ObjectId内部存储时为12个字节,比它的十六进制字符串表示更紧凑。两者是不同的东西。

您可以重排整个数据库并使用统一的 _id 字段来解决此问题并确保您的代码以相同的格式保存。 ObjectId 可以通过 MongoDB 快速生成,所以我会在创建新文档时使用它。

我在代码中转换为字符串进行比较,我确保任何看起来像 ObjectId 的东西实际上都用作 ObjectId

值得注意的是 ObjectId (http://docs.mongodb.org/manual/reference/object-id/) 和它的十六进制表示实际上有 12 个字节的差异,ObjectId 是 12 个字节,它是十六进制表示为 24.

不仅是存储效率,还有索引;不仅因为它们更小,而且还因为可以以特殊方式使用 ObjectId 来确保只加载索引的一部分;使用的部件。这在插入时变得最为明显,其中只需要加载该索引的最新部分以确保唯一性。你不能用它的十六进制表示来保证这种行为。

我强烈建议您不要使用 ObjectId 的十六进制表示法。如果你想“让你的生活更轻松”,你最好创建一个不同的 _id,它更小但在某种程度上同样独特且索引友好。