26

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

使用对象 ID:

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

与字符串:

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

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

谢谢

4

3 回答 3

30

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

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

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

于 2013-09-08T07:35:19.720 回答
14

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

于 2013-09-08T08:20:19.133 回答
2

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

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

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

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

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

于 2020-12-09T01:10:38.327 回答