paginación con Cursor
Un cursor es un identificador único o puntero que representa la posición o el orden de un elemento de datos en el conjunto de datos. Por ejemplo, si el conjunto de datos es una lista de entradas de blog ordenadas por fecha, el cursor podría ser la marca de tiempo de cada entrada.
Este tipo de paginación es más optima que la tradicional, pero como todo en la vida tiene sus males, los cuales son:
- No admite el acceso aleatorio ni el salto a una página específica
- Es complejo de aplicar.
La forma como se quería implementar era por medio del ORM que se esta empleando que es Drizzle, la forma de aplicarlo en drizzle es:
const nextUserPage = async (cursor?: number, pageSize = 3) => { await db .select() .from(users) .where(cursor ? gt(users.id, cursor) : undefined) .limit(pageSize) .orderBy(asc(users.id));};En caso de que el campo id no sea auto-incremental, como era en nuestro caso que se estaba usando UUID es así:
const nextUserPage = async ( cursor?: { id: string; //id de tipo uuid createdAt: Date; //fecha en formato numerico auto-incremental }, pageSize = 3, //la cantidad de registros a devolver) => { await db .select({ //lo que se va a consultar } ) .from(users) .where( cursor ? or( gt(users.createdAt, cursor.createdAt), and(eq(users.createdAt, cursor.createdAt), gt(users.id, cursor.id)), ) : undefined, ) .limit(pageSize)};Para mayor información te invito a consultar la documentación de drizzle.