Создание временной шкалы в стиле Twitter с MongoDB - PullRequest
9 голосов
/ 01 октября 2010

Что мне нужно:

Предположим, вы используете MongoDB и у вас есть коллекция с именем users, и у каждого пользователя есть массив "follow" с пользователем _id из людей, за которыми он следует. Затем у вас есть другая коллекция statuses, каждый статус которой содержит _id ее автора. Как вы отображаете для определенного пользователя все статусы, добавленные людьми, за которыми он следует?

Что я пробовал:

Я поместил всех пользователей _id s, за которыми текущий пользователь следует в массиве (я использую PHP), затем я использовал его, чтобы найти все статусы этих пользователей, используя $in.

Вопрос:

Это лучшее решение?

Ответы [ 3 ]

3 голосов
/ 01 октября 2010

Я не вижу другого пути, я реализовал это раньше и у меня не было проблем.

В вашем случае должно быть что-то вроде этого, вы передаете массиву $follower_ids определенного пользователя в качестве аргумента вашей функции:

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

И если вы индексируете статусы (если у вас естьдостаточно овна, чтобы сделать это) на owner_id вы получите результаты очень быстро.

Надеюсь, это поможет, Синан.

1 голос
/ 01 октября 2010

Да, я делаю то же самое. Посмотрите, что Дуайт Мерриман предложил в своем блоге.

http://dmerr.tumblr.com/post/463694595/just-for-fun-a-single-server-twitter-design

0 голосов
/ 09 декабря 2011

То, что вы пробовали, - это то, о чем сначала думают все, однако масштабировать его не так-то просто ... Вы всегда можете добавить больше серверов или использовать шардинг и т. Д. ... Если у вас есть миллион пользователей и людей, которые следят за многими людьми, это решениестало бы очень трудно выполнить.

Есть другое решение, которое в основном просто делает агрегацию, когда кто-то публикует статус.Facebook использует эту идею, и, возможно, ее будет легче масштабировать, и если кто-то отслеживает 25000 человек, он довольно быстро увидит свой список статуса, и вашему серверу не придется «бороться», чтобы быстро получить данные.

Выбудет иметь коллекцию пользователей, каждый пользователь будет иметь массив статусов.Допустим, у вас есть user1 и user2, и этот user1 следует за user2.Когда пользователь2 выдвигает статус, его статус будет сохранен в массиве статусов user1 И в массиве статусов user2.Вы будете использовать больше памяти, что с mongoDB означает больше памяти .... В Facebook они используют Hadoop с HBase для основного хранилища, тогда у них есть огромные массивы серверов с большим объемом памяти.

Один неудобный случай, если выудалить один статус, вы должны удалить его везде ... Основное преимущество этого решения, каждый пользователь будет иметь массив статусов уже в порядке!В предыдущем решении, если вы следуете за 3 пользователями, вам нужно захватить все их каналы, затем отсортировать их, а затем отобразить их ...

[Редактировать] Как Шекхар указывает на комментарий, у Монго есть предел документа.Вам нужно создать коллекцию статусов и сохранить статус дважды, один раз для user2 и один раз для user1, и вам нужно иметь fromId, toId, status и time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...