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

2022-08-30 15:39:51

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

使用对象 ID:

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

与字符串:

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

对于我要将数据发送回客户端的 API...使用字符串意味着我不必“清理”数据...由于我们必须执行第二个查询以获取文件夹文档...是否值得使用 ObjectId?(如果是这样,为什么?

谢谢


答案 1

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

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

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


答案 2

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


推荐