diff --git a/packages/hydrooj/src/handler/status.ts b/packages/hydrooj/src/handler/status.ts index 0b3de992f..5d0137aef 100644 --- a/packages/hydrooj/src/handler/status.ts +++ b/packages/hydrooj/src/handler/status.ts @@ -39,11 +39,11 @@ class AdminStatusHandler extends Handler { const record = await RecordModel.stat(); const status = await getStatus(); const [domainCount, userCount, problemCount, discussionCount, recordCount] = await Promise.all([ - DomainModel.coll.countDocuments(), - UserModel.coll.countDocuments(), - DocumentModel.coll.countDocuments({ docType: DocumentModel.TYPE_PROBLEM }), - DocumentModel.coll.countDocuments({ docType: DocumentModel.TYPE_DISCUSSION }), - RecordModel.coll.countDocuments(), + DomainModel.coll.count(), + UserModel.coll.count(), + DocumentModel.coll.count({ docType: DocumentModel.TYPE_PROBLEM }), + DocumentModel.coll.count({ docType: DocumentModel.TYPE_DISCUSSION }), + RecordModel.coll.count(), ]); this.response.body = { record, diff --git a/packages/hydrooj/src/lib/paginate.ts b/packages/hydrooj/src/lib/paginate.ts index bf3da8fd7..59b3b7f79 100644 --- a/packages/hydrooj/src/lib/paginate.ts +++ b/packages/hydrooj/src/lib/paginate.ts @@ -12,8 +12,9 @@ async function paginate( filter = cursor[key]; break; } + const coll = db.collection(cursor.namespace.collection as any); const [count, pageDocs] = await Promise.all([ - db.collection(cursor.namespace.collection as any).countDocuments(filter), + Object.keys(filter).length ? coll.count(filter) : coll.countDocuments(filter), cursor.skip((page - 1) * pageSize).limit(pageSize).toArray(), ]); const numPages = Math.floor((count + pageSize - 1) / pageSize); diff --git a/packages/hydrooj/src/model/contest.ts b/packages/hydrooj/src/model/contest.ts index a8fe73f6b..de0626b2b 100644 --- a/packages/hydrooj/src/model/contest.ts +++ b/packages/hydrooj/src/model/contest.ts @@ -986,6 +986,7 @@ export const statusText = (tdoc: Tdoc, tsdoc?: any) => ( global.Hydro.model.contest = { RULES, + buildContestRule, add, getListStatus, getMultiStatus, diff --git a/packages/hydrooj/src/model/record.ts b/packages/hydrooj/src/model/record.ts index 3d5344da8..7dfa77a75 100644 --- a/packages/hydrooj/src/model/record.ts +++ b/packages/hydrooj/src/model/record.ts @@ -49,14 +49,17 @@ export default class RecordModel { @ArgMethod static async stat(domainId?: string) { + // INFO: + // using .count() for a much better performace + // @see https://www.mongodb.com/docs/manual/reference/command/count/ const [d5min, d1h, day, week, month, year, total] = await Promise.all([ - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-1, 'week')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments({ _id: { $gte: Time.getObjectID(moment().add(-1, 'year')) }, ...domainId ? { domainId } : {} }), - RecordModel.coll.countDocuments(domainId ? { domainId } : {}), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'week')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'year')) }, ...domainId ? { domainId } : {} }).count(), + RecordModel.coll.find(domainId ? { domainId } : {}).count(), ]); return { d5min, d1h, day, week, month, year, total, diff --git a/packages/hydrooj/src/service/monitor.ts b/packages/hydrooj/src/service/monitor.ts index 893b3e476..7fc17223f 100644 --- a/packages/hydrooj/src/service/monitor.ts +++ b/packages/hydrooj/src/service/monitor.ts @@ -18,11 +18,11 @@ export async function feedback(): Promise<[string, StatusUpdate]> { const [mid, $update, inf] = await sysinfo.update(); const [installId, name, url] = system.getMany(['installid', 'server.name', 'server.url']); const [domainCount, userCount, problemCount, discussionCount, recordCount] = await Promise.all([ - domain.coll.countDocuments(), - user.coll.countDocuments(), - document.coll.countDocuments({ docType: document.TYPE_PROBLEM }), - document.coll.countDocuments({ docType: document.TYPE_DISCUSSION }), - record.coll.countDocuments(), + domain.coll.count(), + user.coll.count(), + document.coll.count({ docType: document.TYPE_PROBLEM }), + document.coll.count({ docType: document.TYPE_DISCUSSION }), + record.coll.count(), ]); const info: Record = { mid: mid.toString(),