我需要在集合中標記文檔,我們稱之爲「聯繫人」。如何在MongoDB中標記文檔?
我的第一個想法是爲每個文檔創建一個名爲「tags」的屬性。 那麼,在這種情況下,我們有這樣的事:
{
_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邏輯,但我在某些情況下接受。
- 大(對我來說)問題:如何通過PERSONAL標籤搜索聯繫人?在這種情況下,我們有一個很好的'JOIN'問題,MongoDB使用$ lookup很好地解決了這個問題。 對於10000,20000乃至500000個文檔,「解決得好」。但由於我想確保未來的良好表現,我認爲約有1000萬個聯繫人。因此,正如我最近研究的那樣,$查找適用於宇宙的「小部分」,即使使用索引,這種搜索也需要很長時間才能執行。
如何解決這個挑戰?
感謝所有