2010-10-01 10 views
9

Co potrzebne:Wykonywanie Twitter-like timeline z MongoDB

Załóżmy używasz MongoDB i masz zbiór nazywany users, a każdy użytkownik ma "następujący" tablicę z użytkownikiem _id S o ludzie, których ściga. Następnie masz inną kolekcję statuses, z każdym stanem zawierającym _id autora. W jaki sposób wyświetlasz określonemu użytkownikowi wszystkie stany dodane przez osoby, które obserwuje?

Co próbowałem:

kładę wszyscy użytkownicy _id y, że bieżący użytkownik jest poniżej w tablicy (używam PHP), a następnie użyłem go znaleźć wszystkie statusy przez tych użytkowników przy użyciu $in.

Pytanie:

Jest to najlepsze rozwiązanie?

Odpowiedz

3

Nie widzę innego sposobu, zaimplementowałem coś takiego wcześniej i nie miałem problemu.

Na razie należy sth tak, przechodzą $follower_ids tablicę określonego użytkownika jako argument do funkcji:

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

a jeśli indeks statusy (jeśli masz wystarczająco dużo pamięci RAM, aby to zrobić) po owner_id uzyskasz bardzo szybkie wyniki.

Mam nadzieję, że to pomaga, Sinan.

0

Co próbowałeś jest co każde ciało myśleć najpierw jednak to naprawdę nie jest łatwo skalować ... Zawsze można dodać więcej serwerów lub użyj sharding etc ... Jeśli masz milion użytkowników i osób którzy podążają za wieloma ludźmi, rozwiązanie to byłoby naprawdę trudne do wykonania.

Istnieje inne rozwiązanie, które polega po prostu na agregowaniu, gdy ktoś wysyła status. Facebook korzysta z tego pomysłu i może być łatwiejsze skalowanie, a jeśli ktoś śledzi 25 000 osób, szybko zobaczy swoją listę statusową, a serwer nie będzie musiał "walczyć", aby szybko odzyskać dane.

Będziesz mieć kolekcję użytkowników, każdy użytkownik będzie miał tablicę statusów. Powiedzmy, że masz user1 i user2, a ten użytkownik1 wykonaj user2. Kiedy user2 wciśnie status, jego status zostanie zapisany w tablicy user1 statusów AND w tablicy user2 statusów. Użyjesz więcej pamięci, co przy mongoDB oznacza więcej pamięci ... Na Facebooku używają Hadoop z HBase do przechowywania głównego, a następnie mają ogromne tablice serwerów z dużą ilością pamięci.

Niewygodne jest to, że jeśli usuniesz jeden status, musisz go usunąć wszędzie ... Główna zaleta tego rozwiązania, każdy użytkownik będzie miał już uporządkowany status! W poprzednim rozwiązaniu, jeśli podążysz za 3 użytkownikami, musisz pobrać wszystkie swoje pliki, a następnie posortować je, a następnie renderować ...

[Edytuj] Jak wskazuje Shekhar w komentarzu, Mongo ma limit dokumentu.Musisz utworzyć kolekcję statusu i zapisz status dwa razy, raz dla użytkownika2 i raz dla użytkownika1 i musisz mieć identyfikator, identyfikator, status i czas.

+0

Biorąc pod uwagę, że rozmiar dokumentu w MongoDB nie może być większy niż 16 MB . Czy nie osiągnąłbyś limitu i ostatecznie musisz stworzyć nową kolekcję? – Shekhar

+0

Tak naprawdę to dlatego, że mój przykład pochodzi z Facebooka, które używają HBase, dla MongoDb można utworzyć kolekcję statusu, gdy user2 popchnie stan, który zapiszesz dwukrotnie, raz dla użytkownika 2 i drugi raz dla użytkownika 1, twój dokument statusu będzie zawierał identyfikator fromId , toid, czas i sam status ... – zzarbi