Ответ 1
Выяснил это. См. Мое объяснение выше в оригинальной публикации.
Возьмите систему личных сообщений 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". Я смогу рассказать, кто отправитель, и сортировать по метке времени.
Выяснил это. См. Мое объяснение выше в оригинальной публикации.
Вам понадобится какая-то связь между двумя коллекциями (пользователями и сообщениями).
Лично я бы сохранил это просто и добавил два дополнительных поля для отслеживания идентификатора отправителя и получателя, что-то вроде этого:
{
_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), но он выглядит довольно эффективно.