mongoose私人聊天消息模型

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

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

2)不要与用户存储聊天,只要聊天模型存储一对user_ids和消息数组。

选项(1)的问题是每当用户join或开始聊天时,我需要首先查看数组,以便用户查看user_id,chat_id对是否已经存在。 然后在Chat中查找chat_id。 如果它不存在,我需要在两个不同的地方为参与的两个用户创builduser_id,chat_id对。

使用选项(2),我将通过聊天模型searchuser_id1,user_id2对,如果我find了,我完成了,如果没有,我会创build一个新的聊天logging对这对完成。

基于这个选项(2)似乎是处理这个问题的更好的方法。 然而,我遇到了一些问题,如何在聊天模型中轻松search到用户id的“对”。 即我如何确保我可以find聊天logging,即使user_id以错误的顺序传递,即user_id2,user_id1。 在Mongoose中build模的最好方法是什么?

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' }] }); 

如果是这样的话,我将如何search参与者对? 我能否以某种方式排列参与者ID,以便他们总是以参与者1 <参与者2为例,使search变得更简单?

几点build议。

首先 – 为什么将Participant1和2存储为数组? 有一个特定的发件人和一个(或多个)收件人(取决于您是否需要群组消息)。

考虑下面的模式:

var ChatSchema = new Schema({ sender : { type : mongoose.Schema.Types.ObjectId, ref : 'User' }, messages : [ { message : String, meta : [ { user : { type : mongoose.Schema.Types.ObjectId, ref : 'User' }, delivered : Boolean, read : Boolean } ] } ], is_group_message : { type : Boolean, default : false }, participants : [ { user : { type : mongoose.Schema.Types.ObjectId, ref : 'User' }, delivered : Boolean, read : Boolean, last_seen : Date } ] });

该模式允许一个聊天文档存储所有消息,所有参与者以及与每个消息和每个参与者相关的所有状态。

布尔is_group_message只是一个简短的方式来过滤哪些是直接/组消息,可能是客户端浏览或服务器端处理。 直接消息显然更容易与查询明智,但都很简单。

meta数组列出了单个消息的每个参与者的传递/读取状态等。 如果我们不处理组消息,这不需要是一个数组,但我们,所以这很好。

在主文档(而不是元子文档)上deliveredread属性也仅仅是告诉最后的消息是否被传递/读取的简便方式。 每次写入文档时都会更新它们。

这个模式允许我们在一个文档中存储关于聊天的所有信息。 甚至小组聊天。