Alex Rivera | Logout

How to keep track of a private messaging system using MongoDB?

Asked 2010-04-20T01:04:49.553
12

Take facebook's private messaging system where you have to keep track of sender and receiver along w/ the message content. If I were using MySQL I would have multiple tables, but with MongoDB I'll try to avoid all that. I'm trying to come up with a "good" schema that can scale and is easy to maintain. If I were using mysql, I would have a separate table to reference the user and and message. See below ...

profiles table

user_id
first_name
last_name

message table

message_id
message_body
time_stamp

user_message_ref table

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

With the schema listed above, I can query for any messages that "Bob" may have regardless if he's the recipient or sender.

Now how to turn that into a schema that works with MongoDB. I'm thinking I'll have a separate collection to hold the messages. Problem is, how can I differentiate between the sender and the recipient? If Bob logs in, what do I query against? Depending on whether Bob initiated the email, I don't want to have to query against "sender" and "receiver" just to see if the message belongs to the user.

I hit up MongoDB's message group and came away with something that may work. Each message would be treated as a "blog" post. When a message is created, add the two users (doesn't matter who sender/receiver is initially) into an array. Each response after that would be treated as a comment, which would be inserted into an array.

MESSAGES

{
    "_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?!",
                "
Edit
Report

1 Answer

2

Figured it out. See my explanation above in original post.

answered 2010-04-24T02:24:19.803

Your Answer