2016-03-17 78 views
3

让我们看看一个简单的“坏”例子:假设我有两个集合'person'和'address'。并且让我们在'地址'中假设我想存储地址关联的人的'_id'。将“引用键”项存储为“地址”集合中的ObjectId vs字符串是否有任何好处?将文档的id保存为另一个文档ObjectId或String

我觉得像把它们存储为字符串不应该伤害,但我没有在mongo工作很长时间,也不知道如果我遵循这种模式会不会伤害到道路。使用人Store _Id as object or string in MongoDB? 而其说的ObjectId是快了,我认为它的真实,如果你正在读取/父集合中使用的ObjectId(用于例如更新读取/更新“人”的收集:

我在这里阅读文章。 ._id作为ObjectId),但我找不到任何暗示如果通过其他集合中的字符串id表示进行搜索(在我们的示例中,通过person._id作为字符串搜索地址集合中的内容),结果可能为true

您的反馈非常感谢。

+1

如何,这是一个不同的问题? ObjectId以12字节存储。 ObjectId的十六进制字符的字符串是24个字节(仅适用于字符,正尾随后加大小参考)。更多的空间,更多的时间。比较慢!这应该不难解决。 –

+0

你是对的,正试图用烬数据处理事情,并没有看到转换objectid到字符串,并返回到objectId很多点,我寻找方便而不是性能。今天早上我做了一个搜索,这个问题也被问到了其他的形式。 –

+1

为了记录您在这里接受的答案,提出了另一个重要的观点。无法手动将其重新转换为字符串或ObjectId值,您无法在不同的“类型”上将事物匹配在一起。我个人更喜欢所有的外部API使用扩展的JSON格式'{“_id”:{“$ oid”:“56ea9e8bb1e015d13b376db5”}}'因为如果我的客户端实际上可以反序列化回'ObjectId',那么我让它知道数据实际上是什么。 –

回答

7

无论性能如何,您应该以与您所指的_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优点

- 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 

字符串优点

- developers can create domain specific _id topologies 

字符串缺点

- developer has to ensure uniqueness of _ids 
- findAndModify() and getNextSequence() queries may be invalidated 

所有这些信息上面是基于meteor框架。对于Mongodb,最好使用ObjectId,原因在于你的问题中存在问题。

1

将它存储为objectId是人为的。由于ObjectId的大小是12个字节,而字符串需要24个字节,所以速度更快。

此外,您应该尝试去规范化您的集合,以便您不需要创建2个集合(与RDBMS相反)。

喜欢的东西,这可能是一般更好:

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

但同样,这取决于你的使用情况。有时这可能不适合。

希望有帮助! :)