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

B T*_*B T 35 mongodb objectid

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

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

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

Sam*_*aye 27

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

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

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

我强烈建议你不要使用OjbectId十六进制表示法.如果你想"让自己的生活变得更轻松",你最好创造一个_id更小但不同的独特和索引友好的不同.

  • 您不需要将 ObjectId 转换为字符串来比较它们。他们确实有一个 equals 方法(至少在 mongo native / mongoskin 中)。 (2认同)

bak*_*kal 6

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

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