在我的聊天应用程序中,我有私人/团体聊天,我需要为用户获取消息。
让我先解释一下整个系统。
消息:
// group message
{
id: 1,
text: 'hello',
chat_id: 'AjK954_e5iP',
created_at: 137615...
},
// private message
{
id: 2,
text: ':)',
chat_id: 'Bho9Sr_f51Rz',
created_at: 137622...
}聊天:
{
id: 'AjK954_e5iP',
type: 'group',
title: 'My Group yay'
},
{
id: 'Bho9Sr_f51Rz',
type: 'private',
participants: ['A', 'B']
}成员:当我们加入一个组/私有聊天时,将在一个名为members的表中创建一个新记录。
// group chat member
{
user_id: 'A',
chat_id: 'AjK954_e5iP',
type: 'group'
}
// private chat member
{
user_id: 'A',
chat_id: 'Bho9Sr_f51Rz',
type: 'private'
}要获取消息,我需要在members和messages上执行一个连接,但是在NoSQL中是不可能的。我可以解决私人聊天的问题,但是对于组聊天,需要内部连接。
SQL方式:
SELECT messages.* from `members`
INNER JOIN `messages`.`chat_id` = `members`.`chat_id`
WHERE `members`.`user_id` = 'A'如果有数千个chat_ids,那么执行where in是很慢的。
// Pseudocode
chat_ids = Members.where('user_id', 'A').get(['chat_id']);
chat_ids = chat_ids.map(item => item.chat_id);
messages = Messages.whereIn('chat_id', chat_ids).orderBy('created_at').limit(20).get();发布于 2022-01-25 19:23:28
我是MongoDB的菜鸟,但这能做你想做的事吗?
db.members.aggregate([
{
"$match": {
user_id: "A"
}
},
{
"$lookup": {
"from": "messages",
"localField": "chat_id",
"foreignField": "chat_id",
"as": "thechats"
}
},
{
"$unwind": "$thechats"
},
{
"$replaceWith": "$thechats"
},
{
"$sort": {
created_at: -1
}
},
{
"$limit": 20
}
])在mongoplayground.net试试吧。
https://dba.stackexchange.com/questions/306430
复制相似问题