【问题标题】:MongoDb: Benefit of using ObjectID vs a string containing an Id?MongoDb:使用 ObjectID 与包含 Id 的字符串的好处?
【发布时间】:2013-09-11 21:26:04
【问题描述】:

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

使用 ObjectID:

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

相对于字符串:

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

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

谢谢

【问题讨论】:

  • 如果您确保您使用的字符串非常独特(就像 ObjectId 生成所确保的那样),它可能不会有太大的不同。此外,BSON 中的 ObjectId 类型限制为 12 个字节,但如果需要,您可以使用更大的字符串。但是,如果您使用来自 Mongo shell 的数据,ObjectId 会派上用场,因为您也可以使用 ObjectId 打印时间戳,而字符串无法做到这一点。这能回答你的问题吗?
  • @Buchi 谢谢.. 该字符串将始终是一个 ObjectID,我可以在 php 中使用它来查找另一个对象 new MongoID('myIDstring');我节省了空间......虽然我不确定交叉点在哪里......将 ObjectIds 转换为字符串并返回给客户端,而不是使用 ObjectIds 而不是字符串来节省空间。

标签: php mongodb


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 Chris, 节省空间对这个系统来说不是问题。我估计通过使用 ObjectIds 而不是字符串可以节省大约 3%... 我也可以通过缩短一些字段名称来轻松节省。我认为不必在我的应用程序中的 ObjectID 和字符串之间来回转换将创建一个更快的 api。
【解决方案2】:

简单地说,例如,如果您将名为 last_name 的文件缩短为 lname ,则每个文档可以节省 9 个字节。如果您的收藏中有数百万个文档,这确实会有所作为。

【讨论】:

  • 谢谢。使用较短的字段名称节省空间的好处。
【解决方案3】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多