這篇部落格文章提供了使用 Prisma 按日、月或年對資料進行分組的實用解決方案。 我自己也曾為此苦苦掙扎,所以我分享這種簡化的方法。我們將使用 Next.js API 端點來分析使用 Prisma 和 MongoDB 的 API 呼叫趨勢,重點放在一段時間內的成功率和呼叫頻率。
有效的儀表板需要以時間間隔對 API 呼叫進行分組。 讓我們使用簡潔的 Prisma 模式:
<code>model ApiCall { id String @id @default(auto()) @map("_id") @db.ObjectId timestamp DateTime @default(now()) status ApiCallStatus // Enum for success or failure. } enum ApiCallStatus { SUCCESS FAILURE }</code>
此模式追蹤每個 API 呼叫的時間戳記和狀態,足以進行趨勢分析。
此 Next.js API 端點聚合 API 呼叫數據,並依指定時間段(年、月或日)進行分組:
<code>import { NextRequest, NextResponse } from 'next/server'; import { startOfYear, endOfYear, startOfMonth, endOfMonth } from 'date-fns'; export async function GET(req: NextRequest) { const range = req.nextUrl.searchParams.get("range"); // 'year' or 'month' const groupBy = req.nextUrl.searchParams.get("groupby"); // 'yearly', 'monthly', 'daily' // Input validation if (!range || (range !== 'year' && range !== 'month')) { return NextResponse.json({ error: "Range must be 'year' or 'month'" }, { status: 400 }); } if (!groupBy || (groupBy !== 'yearly' && groupBy !== 'monthly' && groupBy !== 'daily')) { return NextResponse.json({ error: "Group by must be 'yearly', 'monthly', or 'daily'" }, { status: 400 }); } try { let start: Date, end: Date; if (range === 'year') { start = startOfYear(new Date()); end = endOfYear(new Date()); } else { // range === 'month' start = startOfMonth(new Date()); end = endOfMonth(new Date()); } let groupByFormat: string; switch (groupBy) { case 'yearly': groupByFormat = "%Y"; break; case 'monthly': groupByFormat = "%Y-%m"; break; case 'daily': groupByFormat = "%Y-%m-%d"; break; } const apiCallTrends = await db.apiCall.aggregateRaw({ pipeline: [ { $match: { timestamp: { $gte: { $date: start }, $lte: { $date: end } } } }, { $group: { _id: { $dateToString: { format: groupByFormat, date: '$timestamp' } }, SUCCESS: { $sum: { $cond: [{ $eq: ['$status', 'SUCCESS'] }, 1, 0] } }, FAILURE: { $sum: { $cond: [{ $eq: ['$status', 'FAILURE'] }, 1, 0] } }, TOTAL: { $sum: 1 } } }, { $sort: { _id: 1 } } ] }); return NextResponse.json({ apiCallTrends }); } catch (error) { console.error(error); return NextResponse.json({ error: "An error occurred while fetching data." }, { status: 500 }); } }</code>
這樣的請求:
<code>GET /api/your-endpoint?range=year&groupby=monthly</code>
可能會產生以下回應:
<code>{ "apiCallTrends": [ { "_id": "2025-01", // January 2025 "SUCCESS": 120, "FAILURE": 15, "TOTAL": 135 }, { "_id": "2025-02", // February 2025 "SUCCESS": 110, "FAILURE": 10, "TOTAL": 120 }, { "_id": "2025-03", // March 2025 "SUCCESS": 130, "FAILURE": 20, "TOTAL": 150 } // ... more monthly data ] }</code>
這種方法提供了一種強大而高效的方法,用於使用 Prisma ORM 查詢和分析 MongoDB 中按不同時間範圍分組的時間戳資料。 感謝您的閱讀! 請按讚並訂閱以獲取更多內容! 在 GitHub 和 LinkedIn 上與我聯繫。
以上是使用 Prisma 和 Next.js 分析 API 呼叫趨勢:按週、月或年分組的詳細內容。更多資訊請關注PHP中文網其他相關文章!