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

Loading…
Cancel
Save