【问题标题】:Is it better to save id of a document in another document as ObjectId or String将另一个文档中的文档 ID 保存为 ObjectId 或 String 是否更好?
【发布时间】:2016-03-17 04:31:04
【问题描述】:

让我们举一个简单的“坏”示例:假设我有 2 个集合“人”和“地址”。并假设在“地址”中我想存储与地址相关联的人的“_id”。将此“引用键”项存储为“地址”集合中的 ObjectId 与字符串有什么好处?

我觉得将它们存储为字符串应该不会受到伤害,但我在 mongo 中工作的时间不长,不知道如果我遵循这种模式是否会受到伤害。

我在这里阅读了这篇文章:Store _Id as object or string in MongoDB? 它说 ObjectId 更快,如果您使用父集合中的 ObjectId 获取/更新,我认为它是正确的(例如,使用 person._id 作为 ObjectId 获取/更新“人”集合),但我找不到如果在其他集合中按字符串 id 表示搜索,任何暗示相同的东西都可能是正确的(在我们的示例中,按 person._id 作为字符串在地址集合中搜索)

非常感谢您的反馈。

【问题讨论】:

  • 这是一个不同的问题? ObjectId 以 12 个字节存储。具有 ObjectId 的十六进制字符的字符串为 24 字节(仅用于字符,加上尾随然后加上大小参考)。更多空间,更多时间。慢点!这应该不难解决。
  • 你是对的,正在尝试使用 ember 数据来解决问题,并没有看到将 objectid 转换为 string 并返回 objectId 的意义,我正在寻找便利而不是性能。今天早上我做了一个搜索,这个问题也以其他形式提出过。
  • 为了记录,您在此处接受的答案提出了另一个重要的观点。如果不手动重新转换为字符串或 ObjectId 值,则无法将不同“类型”上的事物匹配在一起。就我个人而言,我真的更喜欢所有外部 API 都使用扩展的 JSON 格式 { "_id": { "$oid": "56ea9e8bb1e015d13b376db5" } },因为如果我的客户端实际上可以反序列化回 ObjectId,那么我会让它知道数据实际上是什么。

标签: mongodb


【解决方案1】:

无论性能如何,您都应该以与您所引用的 _id 字段相同的格式存储“引用键”。这意味着,如果您推荐的文件是:

{ _id: ObjectID("68746287..."), value: 'foo' }

那么您将其称为:

{ _id: ObjectID(…parent document id…), subDoc: ObjectID("68746287...")

如果您指向的文档有一个字符串作为 ID,那么它看起来像:

{ _id: "derick-address-1", value: 'foo' }

那么您将其称为:

{ _id: ObjectID(…parent document id…), subDoc: "derick-address-1" }

除此之外,因为您在谈论人员和地址,所以将它们完全放在两个文档中可能更有意义,而是嵌入文档:

{ _id: ObjectID(…parent document id…),
  'name' : 'Derick',
  'addresses' : [
     { 'type' : 'Home', 'street' : 'Victoria Road' },
     { 'type' : 'Work', 'street' : 'King William Street' },
  ]
}

【讨论】:

    【解决方案2】:

    至于使用string 作为文档ID,在meteor collection 中,您可以将文档ID 生成为Random.id() 作为字符串或Meteor.Collection.ObjectID() 作为ObjectId

    在这个讨论循环中,Mongodb string id vs ObjectId,这是一个很好的总结,

    ObjectId 优点

    • 它有一个嵌入的时间戳。
    • 这是默认的 Mongo _id 类型;无处不在
    • 与其他应用和驱动程序的互操作性

    ObjectId 缺点

    • 它是一个对象,在实践中更难操作。
    • 有时您会忘记将字符串包装在 new ObjectId() 中
    • 它需要创建服务器端对象来保持_id 唯一性 - 这使得通过 minimongo 在客户端生成它们有问题

    弦乐高手

    • 开发人员可以创建特定领域的 _id 拓扑

    字符串缺点

    • 开发者必须确保 _id 的唯一性
    • findAndModify() 和 getNextSequence() 查询可能无效

    以上所有信息均基于meteor 框架。对于Mongodb,最好使用ObjectId,原因在您问题中链接的问题中。

    【讨论】:

      【解决方案3】:

      将其存储为 objectId 是有益的。与需要 24 字节的字符串相比,ObjectId 的大小为 12 字节,因此速度更快。

      此外,您应该尝试对集合进行反规范化,这样您就不需要创建 2 个集合(与 RDBMS 相对)。

      一般来说,这样的事情可能会更好:

      { _id : "1",
        person : { 
                   Name : "abc",
                   age: 20
                 },
        address : { 
                   street : "1st main",
                   city: "Bangalore",
                   country: "India"
                  }
      }
      

      但同样,这取决于您的用例。这有时可能不合适。

      希望对您有所帮助! :)

      【讨论】:

        猜你喜欢
        • 2017-06-22
        • 1970-01-01
        • 2019-11-18
        • 2012-12-24
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 2021-05-15
        • 2020-04-19
        相关资源
        最近更新 更多