perf: 优化fetchConverseLastMessages查询语句,防止数据量过大导致请求超时

pull/64/head
moonrailgun 2 years ago
parent 13134ce4e3
commit 91fe01f247

@ -260,32 +260,31 @@ class MessageService extends TcService {
*/
async fetchConverseLastMessages(ctx: TcContext<{ converseIds: string[] }>) {
const { converseIds } = ctx.params;
const list = await this.adapter.model
.aggregate<{
_id: string;
lastMessageId: string;
}>([
{
$match: {
converseId: {
$in: converseIds.map((id) => new Types.ObjectId(id)),
},
},
},
{
$group: {
_id: '$converseId' as any,
lastMessageId: {
$last: '$_id',
// 这里使用了多个请求但是通过limit=1会将查询范围降低到最低
const list = await Promise.all(
converseIds.map((id) => {
return this.adapter.model
.findOne(
{
converseId: new Types.ObjectId(id),
},
},
},
])
.exec();
{
_id: 1,
converseId: 1,
}
)
.sort({
_id: -1,
})
.limit(1)
.exec();
})
);
return list.map((item) => ({
converseId: item._id,
lastMessageId: item.lastMessageId,
return list.filter(Boolean).map((item) => ({
converseId: String(item.converseId),
lastMessageId: String(item._id),
}));
}

Loading…
Cancel
Save