2017-08-25 53 views
1

有了这个简单的例子 (使用短的ObjectId,使其更容易阅读)MongoDB模式设计:通过名称引用ID与引用?

标签文件:

{ 
    _id: ObjectId('0001'), 
    name: 'JavaScript', 
    // other data 
}, 
{ 
    _id: ObjectId('0002'), 
    name: 'MongoDB', 
    // other data 
}, 
... 

假设我们需要一个单独的tag集合,例如我们需要在每个标签上存储一些信息。

如果参考通过ID:

// a book document 
{ 
    _id: ObjectId('9876'), 
    title: 'MEAN Web Development', 
    tags: [ObjectId('0001'), ObjectId('0002'), ...] 
} 

如果参考通过名称:

{ 
    _id: ObjectId('9876'), 
    title: 'MEAN Web Development', 
    tags: ['JavaScript', 'MongoDB', ...] 
} 

据了解, “通过参考ID” 是可行的。

我在想,如果使用“按名称引用”,对书中的信息查询只需要在book集合中找到,我们就可以知道没有加入($lookup)操作,这应该是更快的标签的名称。

如果应用程序在创建和修改图书之前执行标记检查,这应该也是可行的,并且更快。

我仍然不很肯定:

  1. 是否有关于“按名称引用”任何藏起来?
  2. 在“查找所有带有给定标签的书籍”时,“名称引用”会更慢吗?也许ObjectId是某种特殊的?

谢谢。

回答

0

我会说这取决于你的用例是什么标签。正如您所说,如果您通过id引用,则执行$lookup来检索标签名称会更加昂贵。另一方面,如果您预计标签名称可能会频繁更改,那么包含该标签的图书集合中的所有文档都需要在每次更改时更新。

ObjectID只是一个12字节的值,如果在插入的文档中不存在_id,则该值由驱动程序自动生成。有关更多信息,请参阅MongoDB docs。唯一的“特殊行为”将是事实_idhas an index by default。一个索引通常会加快查找速度,但可以在任何字段创建索引,而不仅仅是_id。其实_id不需要是ObjectID。例如,具有整数_id值的文档是完全合法的:

{ 
    _id: 1, 
    name: 'Javascript' 
}, 
{ 
    _id: 2, 
    name: 'MongoDB' 
},