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

时间:2013-09-08 04:37:12

标签: php mongodb

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

使用ObjectID:

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

与字符串:

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

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

由于

3 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:0)

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

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

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

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

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

相关问题