让我们举一个简单的"坏"例子:假设我有 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"
}
}
但同样,这取决于您的用例。这有时可能不合适。
希望对您有所帮助! :)