I am planning to move my mysql db of chat_latest and chat_messages to mongodb.
Old Mysql tables:
chat_latest:
User1 User2 LatestState
1 2 Accepted
1 3 Declined
chat_messages:
sender datetime body stateWhileMessageWasSend datetime
1 2 hiii 0 SenderInitiated
2 1 hiii 1 recAccepted
2 1 hiii 2 recAccepted
1 3 hiii 0 SenderInitiated
3 1 hiii 1 recAccepted
3 1 hiii 2 recDeclined
which i moved to mongodb
db.chat.find().pretty().limit(3)
{
"_id" : ObjectId("593921425ccc8150f35e7662"),
"user1" : 1,
"user2" : 2,
"LatestState" : "Accepted",
"messages" : [
{
"sender" : 1,
"datetime" : ISODate("2017-06-08T10:04:50Z"),
"body" : "hiii 0",
"stateWhileMessageWasSend" : "SenderInitiated"
},
{
"sender" : 2,
"datetime" : ISODate("2017-06-09T10:04:50Z"),
"body" : "hiii 1",
"stateWhileMessageWhileSend" : "recAccepted"
},
{
"sender" : 2,
"datetime" : ISODate("2017-06-10T10:04:50Z"),
"body" : "hiii 2",
"stateWhileMessageWhileSend" : "recAccepted"
}
]
}
{
"_id" : ObjectId("593921425ccc8150f35e7663"),
"user1" : 1,
"user2" : 3,
"LatestState" : "Declined",
"messages" : [
{
"sender" : 1,
"datetime" : ISODate("2017-06-08T10:04:50Z"),
"body" : "hiii 0",
"stateWhileMessageWhileSend" : "SenderInitiated"
},
{
"sender" : 3,
"datetime" : ISODate("2017-06-09T10:04:50Z"),
"body" : "hiii 1",
"stateWhileMessageWhileSend" : "recAccepted"
},
{
"sender" : 3,
"datetime" : ISODate("2017-06-10T10:04:50Z"),
"body" : "hiii 2",
"stateWhileMessageWhileSend" : "recDeclined"
}
]
}
{
"_id" : ObjectId("593921425ccc8150f35e7664"),
"user1" : 1,
"user2" : 4,
"LatestState" : "Canceled",
"messages" : [
{
"sender" : 1,
"datetime" : ISODate("2017-06-08T10:04:50Z"),
"body" : "hiii 0",
"stateWhileMessageWhileSend" : "SenderInitiated"
},
{
"sender" : 1,
"datetime" : ISODate("2017-06-09T10:04:50Z"),
"body" : "hiii 1",
"stateWhileMessageWhileSend" : "senderCanceledLiking"
}
]
}
Cases:
I need to find latest state between 2 user, which I can find easily.
I need to list all acceptance user where user1=1
need queries like Match conditions and latest date from array
Question:
Since my 30% queries are similar to case3, so is it a better design as I guess aggregation are slow.
Record Count: 300 million