2013-05-22 45 views
0

在我的應用程序中有users。每個用戶可能有很多朋友(其他用戶)。如果用戶A有一個朋友B,那麼用戶B有一個朋友A-總是。例如,我將不得不查詢用戶集合以獲取用戶A的所有朋友。我還必須使用geospacial索引進行此查詢,以獲得用戶A在給定半徑範圍內來自用戶A的所有朋友。如何模擬recurency並在MongoDB中有很多關係?

我在嘗試在MongoDB中「建模」此結構時遇到了一些問題。 現在我有這樣的(在貓鼬):

{ 
    created: { type: Date, default: Date.now }, 
    phone_number: { type: String, unique: true }, 
    location: { type: [Number], index: '2dsphere' }, 
    friends: [{ phone_number: String }] 
} 

因此,每個用戶包含其他用戶的電話號碼的數組(電話號碼識別每個用戶)。但我不認爲這是一個好主意,因爲一個用戶可能有零個或很多朋友 - 所以朋友陣列將是可變的,並可能顯着增長。

建模該結構的最佳選擇是什麼?

回答

2

兩種方法:

加入收藏

的關係的做法類似那裏是具有代表友誼(本質上是兩個對象id及有關的關係可能的元數據)文件的集合。上的每個用戶

陣列創建一個數組並推動的朋友的對象ID的到陣列上。

當友誼創建時,您需要修改兩個朋友(將每個朋友推送到另一個朋友列表中)。友誼解散也是一樣。

哪一個?

聯合收集方法比較慢,因爲它需要多個查詢來獲取友情數據,而不是讓它自己與用戶保持聯繫(利用數據本地化)。但是,如果關係的數量以無限制的方式增長,那麼陣列方法是不可行的。 MongoDB文檔具有16mb的限制,並且實際上限爲1000左右,之後與數組一起工作變得緩慢且笨拙。

+0

嗯所以,如果我假設每個用戶可能有多達1000個朋友,那麼我最好在每個用戶權限上使用數組? – user606521

+0

但是數組格式有一個錯誤,您不能存儲關於友誼的額外信息。這可能是一個問題。 –

+0

並非如此,您始終可以將對象(嵌入式文檔)存儲在包含友誼元數據的陣列中。 –