2

我试图弄清楚如何将文档链接/引用到另一个文档,但我在文档或其他来源中找不到太多信息或示例。链接文档时,我必须通过 ObjectID 链接还是可以使用任何字段?我需要直接从原始文档中提取字段值,还是可以从任何地方传递相同的值?例如,给定一个 UUID 对象的十六进制字符串,我想通过包含 uuid1 对象的字段“GUID”链接 2 个文档:

 # What is more efficience/the correct way, option 1 or 2?

 # Option 1
 hexString = '5d78ad35ea5f11e1a183705681b29c47'
 newLinkField = { 'linkToSong' : uuid.UUID( hexString ) }
 db.artists.update( { 'name' : 'Bob Dylan' }, { $set : newLinkField }, upsert = False)

 # Option 2
 hexString = '5d78ad35ea5f11e1a183705681b29c47'
 songGUID = db.songs.find_one({ 'GUID' : uuid.UUID( hexString ) }, {'GUID': 1 });
 newLinkField = { 'linkToSong' : songGUID }
 db.artists.update( { 'name' : 'Bob Dylan' }, { $set : newLinkField }, upsert = False)

此外,这是存储实际链接还是只是 UUID 对象的副本?

4

2 回答 2

3

我强烈推荐这个 10gen 视频,以了解链接和嵌入、如何使用它们以及权衡是什么:

http://www.10gen.com/presentations/mongosv-2011/schema-design-principles-and-practice

要回答您的问题:将文档 A“链接”到文档 B 只是意味着将一些信息放入 A 中,以允许您的应用程序查询 B。通常,它会是这样的:

// Document A, in collection 'comments':
{ _id: ObjectId('123...'), user: ObjectId('abc...'), text: 'Hi!' }

// Document B, in collection 'users':
{ _id: ObjectId('abc...'), name: 'Jesse' }

文档 A,我的评论,链接到 B,我的用户资料。您的应用程序可以查询它想要的 A(按 _id、按用户、按文本……),然后检查其“用户”字段,然后通过查询该 ObjectId 的用户集合来查找我的用户配置文件。

您用于将 A 链接到 B 的字段在 B 的集合中应该是唯一的,并且绝对应该在 B 的集合中被索引。

任何集合的 _id 字段始终满足这两个要求,但也可以由其他一些字段满足。

你的例子1很好。尽管您可能会反过来:歌曲中应该有艺术家 ID,而不是相反,除非 Bob Dylan 只写过一首歌。

在示例 2 中,如果您已经知道将如何查询艺术家文档,则在艺术家​​之前查找歌曲是不必要且昂贵的。

于 2012-08-24T17:42:38.070 回答
-1

Mongoengine可以在开箱即用的模型之间进行引用。但是对于面向文档的数据库,这确实是一件坏事。因为您可能会在扩展数据库时遇到问题,并且基于引用解决会降低 noSQL 数据库的性能。随意在一张唱片中写入您需要的所有数据,例如,如果您需要为歌曲创建唱片,您可以这样做:

{'title': 'Black and white', 'singer': 'M Jackson', 'album': 'Some album' and etc}

不要害怕数据开销,面向对象的数据库主要是为这些东西设计的。

于 2012-08-23T08:50:46.907 回答