首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加入NoSQL为用户获取聊天消息

加入NoSQL为用户获取聊天消息
EN

Database Administration用户
提问于 2022-01-22 14:57:37
回答 1查看 487关注 0票数 -1

在我的聊天应用程序中,我有私人/团体聊天,我需要为用户获取消息。

让我先解释一下整个系统。

消息:

代码语言:javascript
复制
// 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...
}

聊天:

代码语言:javascript
复制
{
  id: 'AjK954_e5iP',
  type: 'group',
  title: 'My Group yay'
},
{
  id: 'Bho9Sr_f51Rz',
  type: 'private',
  participants: ['A', 'B']
}

成员:当我们加入一个组/私有聊天时,将在一个名为members的表中创建一个新记录。

代码语言:javascript
复制
// group chat member
{
  user_id: 'A',
  chat_id: 'AjK954_e5iP',
  type: 'group'
}

// private chat member
{
  user_id: 'A',
  chat_id: 'Bho9Sr_f51Rz',
  type: 'private'
}

问题

要获取消息,我需要在membersmessages上执行一个连接,但是在NoSQL中是不可能的。我可以解决私人聊天的问题,但是对于组聊天,需要内部连接。

SQL方式:

代码语言:javascript
复制
SELECT messages.* from `members`
    INNER JOIN `messages`.`chat_id` = `members`.`chat_id`
         WHERE `members`.`user_id` = 'A'

坏解决方案

如果有数千个chat_ids,那么执行where in是很慢的。

代码语言:javascript
复制
// 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();
EN

回答 1

Database Administration用户

发布于 2022-01-25 19:23:28

我是MongoDB的菜鸟,但这能做你想做的事吗?

代码语言:javascript
复制
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试试吧。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/306430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档