दुई रणनीति: offset-based (limit/offset) र cursor-based। GraphQL सँग built-in pagination छैन, तर community मानक Relay Connection spec हो, जसले cursor pagination लाई औपचारिक बनाउँछ।
दुई रणनीति: offset-based (limit/offset) र cursor-based। GraphQL सँग built-in pagination छैन, तर community मानक Relay Connection spec हो, जसले cursor pagination लाई औपचारिक बनाउँछ।
items(limit: 10, offset: 20)) सरल छ तर live data मा भाँचिन्छ: user page गर्दै गर्दा कुनै row insert भयो भने, items सर्छन् र तपाईंले duplicate वा gap देख्नुहुन्छ। गहिरो offset मा यो सुस्त पनि हुन्छ (DB ले अझै skip गरिएका rows स्क्यान गर्छ)।Connection ले list लाई edges (प्रत्येकमा एउटा cursor र node) र pageInfo मा बेर्छ:
type Query {
posts(first: Int!, after: String): PostConnection! # first = page size, after = cursor
}
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
}
type PostEdge {
cursor: String! # opaque token for THIS node's position
node: Post! # the actual item
}
type PageInfo {
endCursor: String # feed this back as 'after' for the next page
hasNextPage: Boolean! # so the client knows when to stop
}
// resolver: fetch ONE extra row to compute hasNextPage cheaply
const rows = await db.posts.find({ after: args.after, limit: args.first + 1 });
const hasNextPage = rows.length > args.first;
const page = rows.slice(0, args.first);
return {
edges: page.map((p) => ({ node: p, cursor: encodeCursor(p.id) })),
pageInfo: { endCursor: page.at(-1) && encodeCursor(page.at(-1).id), hasNextPage },
};
Cursor opaque हुन्छ — सामान्यतया sort key को base64 — त्यसैले client हरूले यसलाई संख्या होइन, token को रूपमा व्यवहार गर्छन्।
Offset बनाम cursor छान्नुले तपाईंले समवर्ती writes अन्तर्गत consistency र गहिरो-page performance बुझ्नुहुन्छ भन्ने देखाउँछ। Relay connection आकार थाहा पाउनु महत्त्वपूर्ण छ किनभने Apollo/Relay client हरूसँग यसका लागि built-in cache handling हुन्छ।
विस्तृत उत्तरसहित IT अन्तर्वार्ता प्रश्नहरूको पुस्तकालय — जुनियरदेखि सिनियरसम्म।
दान गर्नुहोस्