MongoDb:使用ObjectID对包含Id的字符串的好处是什么?

Sun*_*nil 14 php mongodb

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

使用ObjectID:

{
   "_id": ObjectId("522bb79455449d881b004d27"),
   "username": "admin",
   "folder": ObjectId("522bb79455449d881b004d23")
}
Run Code Online (Sandbox Code Playgroud)

与字符串:

{
   "_id": ObjectId("522bb79455449d881b004d27"),
   "username": "admin",
   "folder": "522bb79455449d881b004d23"
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Chr*_*ald 19

最大的原因是ObjectIDs是12个字节,而等效的字符串是24个字节.在足够大的集合中,每个ID保存的12个字节真的加起来!这些ID也意味着在读取或写入文档时通过线路传输的字节更少.

此外,一些ODM期望ObjectID用于外部文档引用,并且可能会被ID的字符串版本混淆.我对PHP ODM不够熟悉,但是如果这可能会影响到你.

但是,关于API的东西,你可能应该在将数据发送到客户端之前对数据进行规范化,因为由于Mongo没有强制执行模式,所以你可以在给定的字段中包含任何类型的数据,所以你可能会有一些文件有字符串ID,有些文件有BSON ID,你的API很乐意将它们发送到客户端,但是其中一个可能会导致破坏.在这种特殊情况下,您应该在文档中使用BSON ObjectID,然后将它们转换为API输出中的字符串.

  • 谢谢克里斯,节省空间对于这个系统不是问题。我估计通过使用ObjectIds而不是字符串可以节省大约3%。我也可以通过缩短一些字段名称来轻松地节省这一点。我认为不必在应用程序的ObjectID和字符串之间来回转换将创建更快的api。 (2认同)

小智 6

简单地说,例如,如果您缩短提起命名last_namelname,你可以保存每个文档9个字节。如果您的收藏集中有数百万个文档,这确实会有所作为。

  • 谢谢。使用较短的字段名称节省空间的好处。 (2认同)