将文档的id作为ObjectId或String保存在另一个文档中是否更好?

时间:2016-03-17 04:31:05

标签: mongodb

让我们看一个简单的“坏”示例:假设我有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作为字符串搜索地址集合),则可能是真的

非常感谢您的反馈。

3 个答案:

答案 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"
            }
}

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

希望有所帮助! :)

相关问题