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

时间:2015-01-12 07:12:19

标签: mongodb objectid

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

字符串表单是否具有与对象表单相同的信息? mongo为什么要这么长时间来区分这两种形式呢?当我尝试比较从前端发送的_id时,它会搞砸我。我的数据库与它是否存储字符串形式的id或对象形式id无关,而且我的代码肯定是部分责任,我主要责怪mongo让它变得如此奇怪。

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

2 个答案:

答案 0 :(得分:22)

我个人责怪你的代码。我通过编码正确的方式在我的应用程序中完美地解决了这个问题。我在代码中转换为字符串进行比较,并确保看起来像ObjectId的任何内容实际上都用作ObjectId

值得注意的是,在ObjectIdhttp://docs.mongodb.org/manual/reference/object-id/)和它的十六进制表示之间实际上存在12个字节的差异,ObjectId为12个字节,并且它的十六进制表示为24。

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

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

答案 1 :(得分:4)

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

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