将另一个文档中的文档 id 保存为 ObjectId 还是字符串更好



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

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

我在这里阅读了这篇文章:在MongoDB中将_Id存储为对象或字符串?它说 ObjectId 更快,如果您使用父集合中的 ObjectId 获取/更新,我假设它是真的(例如,使用 person._id 作为 ObjectId 获取/更新"person"集合),但我找不到任何表明如果按其他集合中的字符串 id 表示形式搜索也可能如此(在我们的示例中,按字符串person._id在地址集合中搜索)

非常感谢您的反馈。

无论性能如何,您都应该以与所引用的_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' },
  ]
}

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

在这个讨论循环中,Mongodb 字符串 id 与 ObjectId,这里有一个很好的总结,

ObjectId 优点

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

对象标识缺点

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

字符串优点

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

字符串缺点

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

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

将其存储为 objectId 是有益的。它更快,因为 ObjectId 大小为 12 字节,而字符串需要 24 个字节。

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

一般来说,这样的东西可能会更好:

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

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

希望对您有所帮助! :)

最新更新