Mongoose 私人聊天消息模型

2023-12-22

我正在尝试将用户之间的私人消息添加到我的数据模型中。我一直在两种可能的方法之间来回选择。

1)每个用户都有一个 user_id、chat_id 对的数组,它们对应于他们正在参与的聊天。聊天模型仅存储 chat_id 和消息数组。

2)根本不存储与用户的聊天内容,而只是让聊天模型存储一对 user_id 和消息数组。

选项 (1) 的问题是,每当用户加入或开始聊天时,我需要首先查看该用户的数组,以查看 user_id、chat_id 对是否已存在。然后在 Chat 中再次查找 chat_id。如果它不存在,我需要在两个不同的位置为参与的两个用户创建 user_id、chat_id 对。

使用选项(2),我将在聊天模型中搜索 user_id1、user_id2 对,如果找到,我就完成了,如果没有,我将为该对创建一个新的聊天记录并完成。

基于此选项(2)似乎确实是处理此问题的更好方法。然而,我在弄清楚如何以可以在聊天模型中轻松搜索的方式对用户 ID“对”进行建模时遇到了问题。即,即使 user_id 以错误的顺序传递(即 user_id2、user_id1),我如何确保可以找到聊天记录。在 Mongoose 中建模的最佳方法是什么?

var chatSchema = mongoose.Schema({

  messages: [{
        text: { 
          type: String,
          max: 2000
        },
        sender: { 
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'User'
        }
      }],
  participant1: [{                
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'User'
        }]
  participant2: [{                
          type: mongoose.Schema.Types.ObjectId, 
          ref: 'User'
        }]
});

如果是类似上面的情况,我将如何搜索参与者对?我是否可以以某种方式对参与者 ID 进行排序,以便它们始终为参与者 1


嗯,这个问题没有正确的答案,但可以肯定的是,你提到的方法根本不是最好的!

首先,当您考虑设计“聊天”模型时,您需要考虑到用户之间会存在数百万条消息,因此当您想要获取聊天时,您需要关心性能。

将消息存储到数组中根本不是一个好主意,您的模型的大小将会很大,并且您必须考虑 MongoDB 的文档大小限制当前为每个文档 16 MB。

https://docs.mongodb.com/manual/reference/limits/ https://docs.mongodb.com/manual/reference/limits/

其次,你必须考虑分页方面,因为当聊天量很大时,它会影响性能,当你检索两个用户之间的聊天时,你不会请求自该时间开始以来的所有聊天,你只会请求最近的聊天,然后如果用户滚动聊天,您可以请求较旧的,这方面非常重要,并且由于其对性能的影响而不能被忽视。

我的方法是将每条消息存储在单独的文档中

首先,将每条消息存储在单个文档中将提高获取聊天记录时的性能,并且文档大小将非常小。

这是一个非常简单的例子,你需要根据你的需要改变模型,它只是为了表达想法:

const MessageSchema = mongoose.Schema({
    message:{
        text: { type:String, required:true }
        // you can add any other properties to the message here.
        // for example, the message can be an image ! so you need to tweak this a little
    }
    // if you want to make a group chat, you can have more than 2 users in this array
    users:[{
        user: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true }
    }]
    sender: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true },
    read: { type:Date }
},
{
    timestamps: true
});

您可以通过以下查询获取聊天记录:

 Message.find(({ users: { "$in" : [#user1#,#user2#]} })
    .sort({ updatedAt: -1 })
    .limit(20)

简单又干净! 正如您所看到的,使用这种方法分页变得非常容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongoose 私人聊天消息模型 的相关文章

随机推荐

  • 根据先前活动中的 Gridview 选择显示图像

    我目前有一个正在工作的网格视图 显示一些缩略图 目前 当您选择图像时 它会将较大分辨率的图像保存为壁纸 我想要做的是打开一个新意图 然后根据单击的 GridView 位置显示全分辨率图像 我不确定如何找出从新活动 意图中单击的位置 这是我的
  • Xamarin/Visual Studio 2015:自定义 Proguard 配置

    我需要进行定制的 Proguard 配置 但是我不知道该怎么做 构建新的配置文件时复制到 obj release proguard文件夹 如何定制这个配置文件 只要把你的Proguard cfg进入你的项目 右键单击Proguard cfg
  • NuSOAP 和内容类型

    无法弄清楚如何使 NuSOAP 使用 UTF 8 作为内容类型 它不断吐出 ISO 8859 1 这是我尝试过的相关代码位 soapclient new soapclient url1 wsdl soapclient gt http enc
  • 服务器如何在 RMI 中与客户端建立会话

    我希望有人告诉我在哪里搜索如何在 RMI 中的客户端和服务器之间建立会话 即用于搜索目的的概念的名称是什么 我在 2001 年的书中将其命名为远程会话模式 这个想法是有一个单例 RMI 对象 绑定在注册表中 除了一个login 方法 该方法
  • 使用 mvn appengine:update 更新 Appengine 时出现错误请求

    当我尝试使用 appengine maven plugin 更新 appengine 应用程序时 出现以下错误 400 Bad Request Error when loading application configuration Una
  • 如何在空手道中的功能运行之间共享变量?

    我有一个应用程序 通过使用创建一次令牌karate callSingle in my karate config file 然而 这个令牌在一段时间后就会过期 所以我可能需要在一些测试后重新创建它 我的计划是在一个变量中设置创建时间 该变量
  • 如何在对 Kubernetes 服务的请求上使用会话亲和性?

    我找不到指定 Kubernetes 服务在使用多个副本扩展附属部署时的行为方式的文档 我假设存在某种负载平衡 与服务类型有关吗 另外 我希望服务转发的请求具有一定的亲和力 即 如果可能的话 具有特定后缀的所有请求应始终映射到同一个 pod
  • 通过 pip 成功安装 lxml 后,在 python 命令行中执行“from lxml import etree”时出现错误

    bash 3 2 pip install lxml 2 3 5 tgz Unpacking lxml 2 3 5 tgz Running setup py egg info for package from file Users apple
  • 如何使用 d3.js 更新轴

    我正在尝试在图表上显示不同的数据 用户可以单击单选按钮来更改显示的数据 我正在使用 气泡图 来呈现数据 对于每种类型的数据 我需要更新 Y 轴 域不同 这是我现在所做的 图表初始化 var svg d3 select body main c
  • 使用 json.net 反序列化没有类型信息的多态 json 类

    This 图像 API https api imgur com endpoints gallery调用返回一个包含两者的列表画廊图片 and 画廊相册以 JSON 表示的类 鉴于没有 type 属性告诉反序列化器要表示哪个类 我看不到如何使
  • Android Hello, Gallery教程——“R.styleable无法解析”

    在制作 Hello Gallery 教程 示例应用程序时 之后按照说明进行操作 http developer android com guide tutorials views hello gallery html在网站上 Eclipse
  • 避免并行继承层次结构

    我有两个并行的继承链 Vehicle lt Car lt Truck lt etc VehicleXMLFormatter lt CarXMLFormatter lt TruckXMLFormatter lt etc 我的经验是 随着并行继
  • Control-C 在 Windows 7 上的 git bash 中杀死 Ipython

    在 Linux 上摸爬滚打了这么多年之后 我又回到了可怕的 Windows 环境 我使用 Ipython 并在 git bash 中启动它 我很难使用其他东西 因为我的办公室的环境配置为使用它 因此 当我启动 Ipython 并且错误地启动
  • iPhone OpenGL ES 2.0 与 Cocos2D 混合给出了意想不到的结果

    我有非常简单的 CCScene 只有 1 个 CCLayer 包含 采用标准混合模式的 CCSprite 背景 CCRenderTexture 绘制画笔 其精灵附加到背景精灵上方的根 CCLayer bgSprite CCSprite sp
  • JPA多对多关系未插入生成的表中

    我的项目中有多对多关系 虽然我可以在两个实体表中写入 但关系表没有写入任何内容 以下是我如何使用 JPA 注释来声明这一点 教授 java Entity Table name Professor public class Professor
  • 无法在 ASP.Net MVC 3 项目中使用实体框架保存更改

    学习 asp net mvc 3 EF 代码优先 我对两者都是新手 我的例子很简单 但我仍然无法使它工作 缺少一些简单而明显的东西 我有一堂课 public class Product HiddenInput DisplayValue fa
  • Excel VBA VLookup - 错误 13 - “类型不匹配”

    我正在开发一个 Excel VBA 宏 它从另一张工作表获取客户的电子邮件 我从 VLookup 中收到错误 13 类型不匹配 For Each c In Range D3 D130 Cells If c gt 500 Then Dim e
  • 如何对 istream/istringstream 使用“固定”浮点字段?

    C 有一个名为 fixed 的 I O 操纵器 用于以固定 非科学 形式输入 输出浮点数 它对于输出工作正常 但我不明白如何让输入正常工作 考虑这个例子 include
  • JS - Onload 事件未触发[重复]

    这个问题在这里已经有答案了 这会触发 onload 事件 p Demo p 这不会触发 onload 事件 p Demo p 在第二个示例中 为什么事件没有触发 支持的元素onload are img
  • Mongoose 私人聊天消息模型

    我正在尝试将用户之间的私人消息添加到我的数据模型中 我一直在两种可能的方法之间来回选择 1 每个用户都有一个 user id chat id 对的数组 它们对应于他们正在参与的聊天 聊天模型仅存储 chat id 和消息数组 2 根本不存储