管道帮助"/>
MongoDB约会/聊天应用的聚合管道帮助
我正在使用带有Node.JS / MongoDB后端的MERN堆栈Web应用程序。
我正在构建一个聊天收件箱,其中显示用户的最新对话,并预览该对话中的最新消息。
[我正在尝试创建一个MongoDB聚合,该聚合找到12个最新的“对话”并返回该对话中的最新聊天并附加关联的用户。
管道涉及两个数据库集合:
- 用户集合(每个用户的文档)
- 聊天集(发送的每条消息的文档)聚合管道的目标是返回(发送或接收的)最新聊天记录,并从“用户集合”中附加关联的用户
聊天模式的结构如下:
{
sender: (User Document ID of the sender),
receiver: (User Document ID of the receiver),
timestamp: (Date Message Was Sent)
}
这里是我到目前为止建立的管道:注意:userid变量是发出请求的用户的ObjectID。
var findUserMessages = await Chat.aggregate([
{
$match: {
receiver: userid,
},
},
{ $sort: { createdAt: -1 } },
{
$group: {
_id: "$sender",
createdAt: { $first: "$createdAt" },
isRead: { $first: "$isRead" },
chat_id: { $first: "$_id" },
message: { $first: "$message" },
},
},
{
$project: {
_id: "$chat_id",
createdAt: "$createdAt",
isRead: "$isRead",
senderId: "$_id",
message: 1,
},
},
{
$lookup: {
from: "users",
localField: "senderId",
foreignField: "_id",
as: "user",
},
},
{ $unwind: "$user" },
{ $sort: { createdAt: -1 } },
{ $skip: skip },
{ $limit: 12 },
]);
问题是此聚合返回用户ID为接收者的最新消息。我需要它返回用户是发送者或接收者的最新消息。
我在比赛阶段尝试过:
$match: {
$or: [{ sender: userid }, { receiver: userid }],
},
但是在小组讨论中,我认为我现在需要根据用户是发送者还是接收者来确定ID的条件。如果用户是发送者,则组ID应该是接收者,反之亦然。
{
$group: {
_id: "$sender",
createdAt: { $first: "$createdAt" },
isRead: { $first: "$isRead" },
chat_id: { $first: "$_id" },
message: { $first: "$message" },
},
},
这是我卡住的地方。我尝试过聘用一些代码指导者,但没人能解决这个问题。真的希望有人在StackOverflow上对我有帮助。我已为此请求提供了赏金。
目标:应从每个会话中返回最近的聊天(数量:1),并按最新排序,并附加关联的用户
- 第一步:查找用户是发件人还是收件人的所有聊天
- 第二步:按最新排序
- 第三步:按对话分组
- 第四步:通过会话获取最新聊天记录
- 第五步:找到关联的其他用户并放松
很高兴在需要时提供更多信息。
如果您是Mongoose / MongoDB的专家,并且正在建立聚合管道,并且可以快速,有效地解决此问题,请联系。
谢谢。
回答如下:您在这里提到的
但是在小组讨论中,我认为我现在需要根据用户是发送者还是接收者来确定ID的条件。如果用户是发送者,则组ID应该是接收者,反之亦然。
关键是使用$cond
根据条件设置新字段
$cond
正如我在对您的问题的评论中提到的那样,最好单独保存有用的信息以帮助查询。例如,您可能拥有另一个跟踪“讨论”的集合,该集合在每对发送者和接收者之间都是唯一的,甚至可以在讨论集合中添加最近的消息和时间戳。
更多推荐
MongoDB约会/聊天应用的聚合管道帮助
发布评论