Não tenho certeza sobre o desempenho em grandes consultas, mas isso é pelo menos uma opção.
Você pode adicionar seus resultados a uma matriz agrupando/enviando e depois descontrair com
includeArrayIndex
assim:[
{$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
}}
]
Agora, se seu banco de dados contém uma grande quantidade de registros, e você pretende paginar, você pode usar o estágio $skip e então $limit 10 ou 20 ou o que você quiser exibir por página, e basta adicionar o número do $skip stage para o seu rownum e você obterá a posição real sem ter que empurrar todos os seus resultados para enumerá-los.