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: new Types.ObjectId(id),
converseId: {
$in: converseIds.map((id) => new Types.ObjectId(id)),
},
},
}, },
{ {
$group: { _id: 1,
_id: '$converseId' as any, converseId: 1,
lastMessageId: { }
$last: '$_id', )
}, .sort({
}, _id: -1,
}, })
]) .limit(1)
.exec(); .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