将id作为ObjectId存储到相关文档与将其存储为字符串文字有什么好处吗?
使用ObjectID:
{
"_id": ObjectId("522bb79455449d881b004d27"),
"username": "admin",
"folder": ObjectId("522bb79455449d881b004d23")
}
与字符串:
{
"_id": ObjectId("522bb79455449d881b004d27"),
"username": "admin",
"folder": "522bb79455449d881b004d23"
}
对于我将数据发送回客户端的API ...使用字符串意味着我不必“清理”数据...并且我们必须进行第二次查询以获取文件夹无论如何......是否值得使用ObjectId? (如果是这样,为什么?)
由于
答案 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()具有以下属性和可使用的方法。
str
-返回对象的十六进制字符串表示形式。
作为日期。
ObjectId.toString()
#返回JavaScript表示形式。
ObjectId.getTimestamp()
#返回对象的时间戳部分
ObjectId.valueOf()
#返回对象的十六进制字符串表示形式