En una paginación de cursor normal, filtraría y ordenaría los documentos según el campo created , lo cual es bastante simple. Me gusta esto:
// `cursor` is a string const books = await this.BooksModel.find({ ...(cursor ? { created: { $lt: new Date(cursor) } } : null), }) .sort({ created: -1 }) .limit(first) Mientras tanto, al implementar la búsqueda, (creo que) tengo que ordenar y filtrar los documentos según los metadatos de textScore , que podrían tener duplicados. Para evitar esto, necesito otro campo para filtrar, que es _id . Me imagino que sería algo como esto:
// `cursor` is { id: string, score: number } const books = await this.BooksModel.aggregate( [ { $match: { _id: { $ne: ObjectId(cursor.id) }, $text: { $search: 'sed' } } }, { $project: { title: 1, score: { $meta: 'textScore' } } }, { $match: { score: { $lt: cursor.score } } } ] ) Para lograr el ejemplo anterior, necesito que el cursor contenga no solo el documento _id (como una paginación normal) sino también la score . Me imagino que la longitud del cursor (decodificado) sería muy larga en comparación con la normal. Además, el cursor ahora contiene un objeto en lugar de solo una cadena, lo cual es bastante extraño para un novato como yo. ¿Es esta realmente la forma de crear una paginación de búsqueda basada en cursor?