【发布时间】:2018-01-23 07:03:52
【问题描述】:
我需要在集合中标记文档,我们称之为“联系人”。
我的第一个想法是为每个文档创建一个名为“标签”的属性。 好吧,在这种情况下,我们有类似的东西:
{
_id:'1',
contact_name:'Asya Kamsky',
tags:['mongodb', 'maths', 'travels']
}
现在,假设我们有用户想要标记“联系人”中的任何文档。
如果我们保留为每个文档保存标签属性的决定,因为标签是个人的,我们需要为每个标签使用 userId。 所以我们的文档会是这样(或不是):
{
_id:'1',
contact_name:'Asya Kamsky',
tags:[
{userId:'alex',tags:['mongodb', 'maths', 'travels']},
{userId:'eric',tags:['databases', 'friends', 'japan']},
]
}
现在,让我们稍微复杂一点。假设我们有很多用户,每个人都想用他的个人标签来标记文档。
如何处理?
好的,我们可以为每个文档创建数千个标签:
{
_id:'1',
contact_name:'Asya Kamsky',
tags:[
{userId:'alex',tags:['mongodb', 'maths', 'travels']},
{userId:'eric',tags:['databases', 'friends', 'japan']},
{.....................................................}
{.....................................................}
{......................................................}
]
}
但是,如果我们有数百万用户呢?据我所知,在这种情况下,我们对每个文档都有 16mg 的限制....
此时,担心我的应用程序未来的增长,我决定 创建一个名为“tags”的漂亮分离集合,其中包含类似于以下内容的文档:
{
"contact_name" : "Asya Kamsky",
"useriId" : "alex",
"tags" : ['mongodb', 'maths', 'travels'],
"timestamp" : "2017-08-08 14:33:28"
},
{
"contact_name" : "Asya Kamsky",
"useriId" : "eric",
"tags" : ['databases', 'friends', 'japan'],
"timestamp" : "2017-08-08 14:33:28"
}
也就是说,我们有一个单独的文档,代表每个用户的标签。
又酷又干净,对吧?
好吧,在这种情况下,我们面临两个问题:
- 小问题:我们返回到我不再喜欢但在某些情况下接受的 SQL 逻辑。
- 大(对我而言)问题:如何通过个人标签搜索联系人?在这种情况下,我们有一个很好的 'JOIN' 问题,MongoDB 使用 $lookup 很好地解决了这个问题。 对于 10000、20000 甚至 500000 个文档,“解决得很好”。但由于我想确保未来有良好的表现,我认为有 10000000 个联系人。因此,正如我最近研究的那样,$lookup 适用于 Universe 的“一小部分”,即使使用索引,执行此搜索也需要很长时间。
如何解决这个挑战?
谢谢大家
【问题讨论】:
标签: mongodb collections tags lookup