NodeJS 我需要帮助聚合mongoDb聊天应用程序从每个相关的聊天接收最新消息

v8wbuo2f  于 11个月前  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我正在做一个聊天应用程序,两个人之间只有一次对话,所以我没有制作对话表或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?

1u4esq0p

1u4esq0p1#

也许这一个:

db.collection.aggregate([
   {
      $group: {
         _id: { $sortArray: { input: ["$sender", "$receiver"], sortBy: 1 } },
         messages: {
            $top: {
               sortBy: { createdAt: -1 },
               output: "$$ROOT"
            }
         }
      }
   },
   { $replaceWith: "$messages" },
])

字符串
$top是在MongoDB 5.2版本中引入的。如果您运行的是旧版本,请尝试以下操作:

db.collection.aggregate([
   { $sort: { createdAt: -1 } },
   {
      $group: {
         _id: { $sortArray: { input: ["$sender", "$receiver"], sortBy: 1 } },
         messages: { $first: "$$ROOT" }
      }
   },
   { $replaceWith: "$messages" },
])

相关问题