如何为猫鼬制作私人消息模式?



我正在尝试为后端制作消息模式+路由。我希望两个用户可以互相写一条消息,并且必须为他们俩存储消息。

我制作了用户模型模式和用户路由,它们正在工作,但我被消息传递所困。

mongoDB应该包含消息 如何管理消息发送?

这是我到目前为止尝试过的

消息路由:


var express = require("express");
var User = require("../models/users.js");
var router = express.Router();
const message = require("../models/messages");
router.post("/:recipient", (request, response) => {
User.find({
username: [request.body.sender, request.params.recipient],
//   }, {
//       message: request.body.message
//   }, {
//     upsert: false,
//     new: true,
})
.then((users) => {
users.forEach((user) => {
user.updateMany({
message: request.body.message
})
})
response.status(200).json(users);
})
.catch((error) => {
response.status(500).json(error);
});
});
module.exports = router;

和我的消息架构:


var mongoose = require("mongoose");

var UserMessage = new mongoose.Schema({
user: { "type": mongoose.Schema.ObjectId, "ref": "User" },
username: String,
view: {
inbox: Boolean,
outbox: Boolean,
archive: Boolean
},
content: {type: String},
read: {
marked: { "type": Boolean, default: false },
date: Date
}
});
var schemaMessage = new mongoose.Schema.ObjectId({
from: String,
to: [UserMessage],
message: String,
created: Date
});
module.exports = mongoose.model("Messages", UserMessage);

我对模式非常不确定,我提出了一些关于堆栈溢出的建议。

谢谢!

我现在正在制作一个消息模式,我想到了这样的事情:

const ChatSchema = new mongoose.Schema({
participants: [{type: mongoose.Schema.objectId, ref: "users"}],
last_message: Number,
_id: {type: mongoose.Schema.objectId}
//...
})

在这里,您可以使用相同的架构来创建聊天组,并且为每条消息提供一个单独的文档,其中包含带有聊天室_id字段,因此您可以查询它们

您可能会想,为什么不将所有消息放在一个数组中ChatSchema? 好吧,因为我们不希望用户每次进入聊天时都收到所有消息。

我知道,您可能正在考虑这样的事情,以防止数据过载到客户端

MessageSchema.find(({ ... })
.sort({ updatedAt: -1 })
.limit(20)

但是在这里,您仍然会收到从数据库到服务器的所有消息,并且用户每次聊天甚至可以有1000条消息,因此我想到的一个想法是这样的MessageSchema

const MessageSchema = new mongoose.Schema({
message: String,
chatRoom_id: {type: mongoose.Schema.objectId},
sentBy: {type: mongoose.Schema.objectId, ref: "users"},
seenBy: [{ user: {type: mongoose.Schema.objectId, ref: "users"}, seen: Boolean }],
numberOfMessage: Number
//...
}) 

神奇之处在于numberOfMessage,因为您可以使用如下所示的比较运算符查询 MessageSchema:

const currentMessage = 151 //this is the numberOfMessage number of the last message the user saw, and when the user scrolls up the chat you could send the numberOfMessage of the last loaded message.
//To know from wich numberOfMessage start, just use the ``last_message`` field from the chatroom's ``ChatSchema``

const quantityNewMessages = 10 //this is the quantity of new messages you want the user to recieve

MessageSchema.find({ 
chatRoom_id, 
numberOfMessage: 
{ $lt: currentMessage , $gte: currentMessage + quantityNewMessages } //we use less than operator because the user will always recieve the last message first, so the previous messages are going to have a numberOfMessage less than this first message
})

它将向我们返回一个包含 10 条消息的数组,您可以连接到前端中已有的消息数组。

请注意:

  1. 使用此MessageSchema,所有用户将为每条消息共享相同的文档,您可以在聊天室中为每个用户制作一条消息的单独文档,以便每个用户都可以删除消息而不会影响其他用户。

  2. 我不建议您保存username字段,因为用户可以更改其用户名,如果他这样做,则必须将该用户名的所有消息文档更新为新用户名,因此只需保留 ref 并填充它

  3. 您不应将文档对象放在to字段中,将其设置为单独的文档并仅保存其引用。但我也不建议这样做

  4. 不要使用users.forEach,因为它会修改数组,请使用users.map,因为它返回一个新数组并且不会改变原始数组

  5. 我看到你有一个错误,你正在用forEach( user => user.update(...) )返回的变量询问数据,它应该是map( user => UserSchema.update({ _id: user._id }) )但是,循环数组并每次调用数据库仍然非常昂贵,并且会滞后服务器,因此请使用类似于我向您展示的ChatSchema,因为您可以获取聊天室信息,并使用该聊天室的_id,查询最新消息

还没有测试过这段代码,我正要测试它。如果您遇到任何问题,请随时发表评论

最新更新