我正在做一个聊天应用程序,两个人之间只有一次对话,所以我没有制作对话表或ID,我想向客户端显示聊天列表的方式是这样的:
我会得到与每个对话相关的最新消息,对话由发送者/接收者ID过滤,
因此,如果数据库中有2条消息,第一条消息包含以下数据:
{
sender: "User.x.ID",
receiver: "User.y.ID",
msg: "How are you?",
},
{
sender: "User.y.ID",
receiver: "User.x.ID",
msg: "Good thanks, and you?",
},
字符串
最新消息为"Good thanks, and you?"
我的messageSchema
:
{
sender: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
receiver: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
},
usersRelated: {
type: Array,
},
msg: {
type: String,
}
}
型
下面是我的代码:
const Chats = await Message.aggregate([
{ $sort: { createdAt: -1 } },
{
$match: {
$expr: {
usersRelated: [req.user.id],
},
},
},
{
$group: {
_id: {
sender: "$sender",
receiver: "$receiver",
},
messages: {
$top: {
sortBy: { createdAt: -1 },
output: "$$ROOT",
},
},
},
},
{ $replaceWith: "$messages" },
])
型
它返回了两条我不想要的消息,我只想要最新的消息:"Good thanks, and you?"
。
我的需求背后的原因是:
我试图显示与最新消息的预览聊天的列表一样,大多数聊天应用程序。
因此,如果您以User X
的身份登录,您将在聊天列表中看到的是与User Y
的一次聊天,他们回复了您:"Good thanks, and you?"
,如果您单击聊天,那么我将加载与这两个用户相关的所有消息,如下所示:
User X said : How are you?
User Y Said : Good thanks, and you?
型
1条答案
按热度按时间1u4esq0p1#
也许这一个:
字符串
$top
是在MongoDB 5.2版本中引入的。如果您运行的是旧版本,请尝试以下操作:型