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

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

字符串形式是否与对象形式具有所有相同的信息?为什么 mongo 会花这么多时间来区分这两种形式?例如,当我尝试比较从前端发送的 _ids 时,它把我搞砸了。我的数据库与它是否存储字符串形式的 id 或对象形式的 id 完全不一致,虽然我的代码肯定是部分原因,但我主要责怪 mongo 让这变得如此奇怪。

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

最佳答案

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

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

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

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

https://stackoverflow.com/questions/27896979/

相关文章:

linux - Errr 'mongo.js:L112 Error: couldn' t 连接到服务

mongodb - Mongoose 是否支持 Mongodb `findAndModify` 方法

mongodb - 如何在 MongoDB 中创建嵌套索引?

java - 如何使用 Java mongodb 驱动程序中的 "_id"字段查询文档?

mongodb - 如何使用 Robomongo 连接到 MongoDB Atlas?

java - 如何通过Java在MongoDB中一次插入多个文档

python - 让 Spark、Python 和 MongoDB 协同工作

mongodb - 我控制修补程序上的 Mongo 错误

node.js - 使用 mongoose 在 mongodb 中设置集合的到期时间

node.js - 使用 2 个字段的 Mongoose 自定义验证