Как отслеживать личную систему обмена сообщениями с помощью MongoDB?

Возьмите систему личных сообщений facebook, где вам нужно отслеживать отправителя и получателя по содержимому сообщения. Если бы я использовал MySQL, у меня было бы несколько таблиц, но с MongoDB я постараюсь избежать всего этого. Я пытаюсь придумать "хорошую" схему, которая может масштабироваться и прост в обслуживании. Если бы я использовал mysql, у меня была бы отдельная таблица для ссылки на пользователя и сообщение. См. Ниже...

таблица профилей

user_id
first_name
last_name

таблица сообщений

message_id
message_body
time_stamp

user_message_ref таблица

user_id (FK)
message_id (FK)
is_sender (boolean)

В приведенной выше схеме я могу запросить любые сообщения, которые могут иметь "Боб", независимо от того, является ли он получателем или отправителем.

Теперь как превратить это в схему, которая работает с MongoDB. Я думаю, у меня будет отдельная коллекция для хранения сообщений. Проблема в том, как я могу различать отправителя и получателя? Если Боб регистрируется, что я запрашиваю? В зависимости от того, инициировал ли Боб письмо по электронной почте, я не хочу запрашивать запрос "отправитель" и "получатель", чтобы узнать, принадлежит ли это сообщение пользователю.

Я попал в группу сообщений MongoDB и ушел с чем-то, что может сработать. Каждое сообщение будет рассматриваться как "блог". Когда создается сообщение, добавьте двух пользователей (неважно, кто отправитель/получатель изначально) в массив. Каждый ответ после этого будет рассматриваться как комментарий, который будет вставлен в массив.

СООБЩЕНИЯ

{
    "_id" : <objectID>,
    "users" : ["bob", "amy"],
    "user_msgs" :
        [
            { 
                "is_sender" : "bob",
                "msg_body" : "Hi Amy, how are you?!",
                "timestamp" : <generated by Mongo>
            }
            { 
                "is_sender" : "amy",
                "msg_body" : "Bob, long time no see, how is the family?!",
                "timestamp" : <generated by Mongo>
            }
        ]
}

Таким образом, я могу запросить сообщения, содержащие "Боб", и пропустить через массив "user_msgs". Я смогу рассказать, кто отправитель, и сортировать по метке времени.

Ответ 1

Выяснил это. См. Мое объяснение выше в оригинальной публикации.

Ответ 2

Вам понадобится какая-то связь между двумя коллекциями (пользователями и сообщениями).

Лично я бы сохранил это просто и добавил два дополнительных поля для отслеживания идентификатора отправителя и получателя, что-то вроде этого:

{
    _id: /* whatever_id */,
    message_body: "This is the message",
    date_sent: 2010-04-20T10:35,
    sender_id: /*id_of_sender*/,
    recipient_id: /* id_of_recipient */
}

Поля sender_id и recipient_id будут просто содержать значение для соответствующего пользователя (скорее всего, экземпляр ObjectID, хотя вы можете присваивать то, что вам нравится), который соответствует полю _id для соответствующих записей в коллекции пользователей. Вы могли бы запросить их надлежащим образом, чтобы захватить сообщения, которые вы после (или подсчитать их или что-то еще).

Другой подход может состоять в том, чтобы эффективно сделать то же самое, но использовать формальный DBRef для отправителя и получателя, а не просто поставить их Идентификаторы в. Это, вероятно, будет работать так же хорошо, но я бы пошел с предыдущим решением только потому, что он проще и, вероятно, проще запросить.

Оба решения должны будут выполнить еще один раунд в DB для захвата соответствующих пользовательских документов (например, для отображения имен "from" и "to" ).


Edit:
Казалось бы, я неправильно понял, чего вы пытаетесь достичь, - я не знал, что обмен сообщениями Facebook включает любую концепцию потоковой передачи. Тем не менее, решение, которое вы представили выше, выглядит здорово. Лично я придерживаюсь идентификаторов для пользователей, а не их имен (alice и bob), но он выглядит довольно эффективно.