MongoDB 按 (id1, id2) 或 (id2,id1) 分组
MongoDB group by (id1, id2) or (id2,id1)
我正在使用 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 个用户之间的所有消息分组,然后 select 基于 createdAt 时间的最新消息。
如有任何帮助,我们将不胜感激。
您可以交换 ID,使较小的始终为 a
,较大的始终为 b
:
_id: { $cond: {
if: { $gte: ["$senderId", "$receiverId"] },
then: {
a: '$senderId',
b: '$receiverId'
},
else: {
a: '$receiverId',
b: '$senderId'
}
} },
我正在使用 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 个用户之间的所有消息分组,然后 select 基于 createdAt 时间的最新消息。
如有任何帮助,我们将不胜感激。
您可以交换 ID,使较小的始终为 a
,较大的始终为 b
:
_id: { $cond: {
if: { $gte: ["$senderId", "$receiverId"] },
then: {
a: '$senderId',
b: '$receiverId'
},
else: {
a: '$receiverId',
b: '$senderId'
}
} },