MongoDB约会/聊天应用的聚合管道帮助

编程入门 行业动态 更新时间:2024-10-08 10:51:15

MongoDB约会/聊天应用的聚合<a href=https://www.elefans.com/category/jswz/34/1771259.html style=管道帮助"/>

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约会/聊天应用的聚合管道帮助

本文发布于:2024-05-07 22:04:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1757462.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:管道   MongoDB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!