2010-10-01 31 views
9

我需要什麼:製作一個類似Twitter的時間表與MongoDB的

你使用MongoDB的,你有一個集合稱爲users,並且每個用戶有用戶「下面的」陣列假設_id S的他在追隨的人。然後你有另一個集合statuses,每個狀態包含其作者的_id。 你如何向某個用戶顯示他所關注的人添加的所有狀態?

我的嘗試:

我把所有的用戶_id s表示當前用戶已在陣列中(我使用PHP)以下,然後我用它來找到這些用戶的所有狀態使用$in

問題:

這是最好的解決辦法?

回答

3

我看不到任何其他方式,我之前實現了這樣的事情,沒有問題。

在你的情況下,應某事像這樣,你通過某些用戶的$follower_ids數組作爲參數傳遞給你的函數:

$query = array("status_owner_id" => array('$in' => $follower_ids)); 
$cursor = $mongo->yourdb->statuses->find($query); 

如果你的索引狀態(如果你有足夠的內存,這樣做)通過owner_id,你會得到非常快的結果。

希望它有幫助,思南。

0

你嘗試過什麼,是每個身體首先想到不過這不是真的很容易擴展...您可以隨時添加更多的服務器,或使用分片等.. 如果你有用戶和人民萬元誰跟隨很多人這個解決方案將變得很難執行。

還有另一種解決方案,基本上只是在有人發佈狀態時進行聚合。 Facebook使用這個想法,它可能更容易擴展,如果有人跟隨25000人,他會很快看到他的狀態列表,並且你的服務器不會「打架」以快速檢索數據。

您將擁有一個用戶集合,每個用戶將擁有一個狀態數組。假設你有user1和user2,而user1跟隨user2。當user2推送一個狀態時,他的狀態將被保存在user1的狀態數組和狀態的user2數組中。你將使用更多的存儲與mongoDB意味着更多的內存....在Facebook他們使用Hadoop與HBase主存儲,然後他們有大量的服務器與大量的內存。

一個不方便的是,如果您刪除一個狀態,則必須將其全部刪除...... 此解決方案的主要優點是,每個用戶都將擁有一組狀態已經滿足!在以前的解決方案,如果你關注3用戶,你需要抓住他們所有的飼料,然後對它們進行分類,然後渲染它們... ...

[編輯]像Shekhar指出int的評論,Mongo有一個文件限制。你需要爲用戶1創建一個狀態集合的保存狀態兩次,一次爲用戶2,一次,需要有一個fromId,風溼,狀態和時間

+0

由於文件大小在MongoDB中不能大於16 MB 。你不會達到極限,最後你必須創建一個新的集合? – Shekhar 2011-12-09 18:35:54

+0

確實是這樣的,因爲我的例子是從Facebook它們使用HBase的,MongoDB的您可以創建一個狀態集合,當用戶2按下狀態保存它,對於user2和user1的第二次兩次,一次,你的身份文件將包含fromId ,一個toId,時間和狀態本身... – zzarbi 2011-12-09 23:11:41

相關問題