用这个简单的例子 (使用简短的ObjectId使其更容易阅读)
标记文档:
{
_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
集合中查找书籍信息,我们就可以知道标签&# 39;没有连接($lookup
)操作的名称,应该更快。
如果应用程序在书籍创建和修改之前执行标签检查,这也应该是可行的,并且更快。
我还不太确定:
ObjectId
有点特别吗?感谢。
答案 0 :(得分:0)
我想说这取决于你的用例是什么标签。正如您所说,如果您通过id引用,则$lookup
检索标记名称会更加昂贵。另一方面,如果您希望标签名称可能经常更改,则每次更改时都需要更新包含该标签的书籍集中的所有文档。
ObjectID只是一个12字节的值,如果插入的文档中没有_id
,则由驱动程序自动生成。有关详细信息,请参阅MongoDB docs。唯一的“特殊行为”是_id
has an index by default。索引通常会加速查找,但可以在任何字段上创建索引,而不仅仅是_id
。
实际上,_id
不需要是ObjectID。例如,具有整数_id
值的文档是完全合法的:
{
_id: 1,
name: 'Javascript'
},
{
_id: 2,
name: 'MongoDB'
},