No estoy seguro del rendimiento en consultas grandes, pero esta es al menos una opción.
Puede agregar sus resultados a una matriz agrupando/empujando y luego relajarse con includeArrayIndex
así:
[
{$match: {author: {$ne: 1}}},
{$limit: 10000},
{$group: {
_id: 1,
book: {$push: {title: '$title', author: '$author', copies: '$copies'}}
}},
{$unwind: {path: '$book', includeArrayIndex: 'rownum'}},
{$project: {
author: '$book.author',
title: '$book.title',
copies: '$book.copies',
rownum: 1
}}
]
Ahora, si su base de datos contiene una gran cantidad de registros y tiene la intención de paginar, puede usar la etapa $skip y luego $limitar 10 o 20 o lo que quiera mostrar por página, y simplemente agregar el número de $skip etapa a su número de fila y obtendrá la posición real sin tener que presionar todos sus resultados para enumerarlos.