MongoDb:使用ObjectID与包含Id的字符串的好处


MongoDb: Benefit of using ObjectID vs a string containing an Id?

id 作为 ObjectId 存储到相关文档与将其存储为字符串文字有什么好处吗?

使用 ObjectID:

{
   "_id": ObjectId("522bb79455449d881b004d27"),
   "username": "admin",
   "folder": ObjectId("522bb79455449d881b004d23")
}

与字符串相比:

{
   "_id": ObjectId("522bb79455449d881b004d27"),
   "username": "admin",
   "folder": "522bb79455449d881b004d23"
}

对于我将数据发送回客户端的 API...使用字符串意味着我不必"清理"数据......而且由于无论如何我们都必须进行第二次查询才能获取文件夹文档......是否值得使用 ObjectId?(如果是这样,为什么?

谢谢

最大的原因是 ObjectID 是 12 个字节,而等效的字符串是 24 个字节。在足够大的集合中,每个 ID 节省的 12 个字节加起来真的很大!这些 ID 还意味着在读取或写入文档时通过网络传输的字节更少。

此外,某些 ODM 需要外部文档引用的对象 ID,并且可能会与 ID 的字符串版本混淆。不过,我对 PHP ODM 不够熟悉,无法说这是否会特别影响您。

但是,关于 API 的东西,无论如何,您可能应该在将数据发送到客户端之前对其进行规范化,因为由于 Mongo 不强制执行模式,因此您可以在给定字段中拥有任何类型的数据,因此您可能有一些文档具有字符串 ID,而其他文档具有 BSON ID, 并且您的 API 很乐意将它们都发送到客户端,但其中一个可能会导致损坏。在这种特殊情况下,您应该在文档中使用 BSON ObjectID,然后应将它们转换为 API 输出中的字符串。

简而言之,例如,如果将名为 last_name 的文件缩短为 lname ,则可以为每个文档节省 9 个字节。如果您的馆藏中有数百万个文档,这确实会有所不同。

此外,ObjectId() 具有以下可以使用的属性和方法。

  1. str - 返回对象的十六进制字符串表示形式。作为日期。

  2. ObjectId.toString() # 返回 JavaScript 表示形式。

  3. ObjectId.getTimestamp() # 返回对象的时间戳部分

  4. ObjectId.valueOf() # 以十六进制字符串的形式返回对象的表示形式