MongoDB按(id1,id2)或(id2,id1)分组

时间:2019-01-25 20:03:25

标签: javascript mongodb typescript aggregation

我正在用mongodb构建一个基本的消息传递系统,并存储如下消息:

消息架构:

{
    senderId: ObjectId,
    receiverId: ObjectId
    createdAt: Date
}

我想显示一个用户和其他用户之间的所有消息线程。 所以我想过滤包含请求用户的所有消息。

但是在这一步之后,我不知道如何按senderId或receiverId分组消息。

$group: {
    _id: {
      senderId: '$senderId',
      receiverId: '$receiverId'
    },
    messages: {
      $push: {
        _id: '$_id',
        body: '$body',
        attachment: '$attachment',
        senderId: '$senderId',
        receiverId: '$receiverId'
      }
    }
} 

此分组将请求用户发送的消息和发送用户接收的消息分为2个不同的组。

理想情况下,我可以将2位用户之间的所有邮件分组,然后根据createdAt时间选择最新的邮件。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以交换ID,以便较小的ID始终为a,较大的ID始终为b

 _id: { $cond: {
  if: { $gte: ["$senderId", "$receiverId"] },
  then: {
    a: '$senderId',
    b: '$receiverId'
  },
  else: {
   a: '$receiverId',
   b: '$senderId'
  }
} },