让我们看一个简单的“坏”示例:假设我有2个集合'person'和'address'。并且假设在'地址'中我想存储与地址相关联的人的'_id'。将这个“参考密钥”项存储为'address'集合中的ObjectId vs string是否有任何好处?
我觉得将它们存放为字符串应该不会受到伤害,但我没有在mongo工作很长时间,如果我遵循这种模式,不知道它是否会伤害我的道路。
我在这里阅读帖子:Store _Id as object or string in MongoDB? 并且它说ObjectId更快,如果你使用父集合中的ObjectId获取/更新(例如,使用person._id作为ObjectId获取/更新'person'集合),我认为它是真的,但我找不到任何暗示如果通过其他集合中的字符串id表示进行搜索(在我们的示例中,通过person._id作为字符串搜索地址集合),则可能是真的
非常感谢您的反馈。
答案 0 :(得分:9)
无论性能如何,您都应该存储"参考密钥"格式与您引用的_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' },
]
}
答案 1 :(得分:3)
至于使用string
作为文档的ID,在meteor collection
中,您可以生成文档ID Random.id()
为字符串,Meteor.Collection.ObjectID()
为ObjectId
。
在这个讨论循环中,Mongodb string id vs ObjectId,这是一个很好的总结,
ObjectId专业人士
- it has an embedded timestamp in it. - it's the default Mongo _id type; ubiquitous - interoperability with other apps and drivers
ObjectId缺点
- it's an object, and a little more difficult to manipulate in practice. - there will be times when you forget to wrap your string in new ObjectId() - it requires server side object creation to maintain _id uniqueness - which makes generating them client-side by minimongo problematic
String Pros
- developers can create domain specific _id topologies
字符串缺点
- developer has to ensure uniqueness of _ids - findAndModify() and getNextSequence() queries may be invalidated
上述所有信息都基于meteor
框架。对于Mongodb,最好使用ObjectId
,原因在于你问题中的问题。
答案 2 :(得分:1)
将其存储为objectId是有益的。它比ObjectId大小为12个字节更快,而字符串则需要24个字节。
此外,您应该尝试对集合进行反规范化,这样您就不需要创建2个集合(与RDBMS相反)。
这样的事情可能会更好:
{ _id : "1",
person : {
Name : "abc",
age: 20
},
address : {
street : "1st main",
city: "Bangalore",
country: "India"
}
}
但同样,这取决于您的用例。这有时可能不合适。
希望有所帮助! :)