Definição
cursor.skip(<offset>)Importante
Método mongosh
Este é um método
mongosh. Esta não é a documentação deNode.jsou de outros métodos de driver específicos da linguagem de programação.Na maioria dos casos, os métodos
mongoshfuncionam da mesma forma que os métodos legado do shellmongo. No entanto, alguns métodos legado não estão disponíveis emmongosh.Para a documentação do shell legado
mongo, consulte a documentação para a release correspondente do MongoDB Server:Para drivers da API do MongoDB, consulte a documentação do driver do MongoDB específica do idioma.
Chame o método
skip()em um cursor para controlar onde o MongoDB começa a retornar resultados. Essa abordagem pode ser útil na implementação de resultados paginados.Observação
Você deve aplicar
skip()ao cursor antes de recuperar quaisquer documentos do banco de dados.O método
skip()tem o seguinte parâmetro:ParâmetroTipoDescriçãooffsetnúmero
O número de documentos a ignorar no conjunto de resultados.
Compatibilidade
Esse método está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Observação
Este comando é aceito em todos os clusters do MongoDB Atlas. Para obter informações sobre o suporte do Atlas a todos os comandos, consulte Comandos não suportados.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Comportamento
Usando skip() com sort()
Se estiver usando skip() com sort(), certifique-se de incluir pelo menos um campo em sua classificação que contenha valores exclusivos, antes de passar os resultados para skip().
A classificação em campos que contêm valores duplicados pode retornar uma ordem de classificação inconsistente para esses campos duplicados em várias execuções, especialmente quando a **coleção** está recebendo gravações ativamente.
A maneira mais fácil de garantir consistência de classificação é incluir o campo _id em sua query de classificação.
Consulte Classificação consistente com o método sort() para obter mais informações.
Usando skip() com limit()
Quando você encadeia skip() e limit(), a ordem de encadeamento do método não afeta os resultados. O servidor sempre aplica a operação de ignorar com base na ordem de classificação antes de aplicar o limite de quantos documentos retornar.
O exemplo de código a seguir mostra diferentes ordens de encadeamento para skip() e limit() que sempre produzem os mesmos resultados de consulta para o mesmo conjunto de dados:
db.myColl.find().sort({_id: 1}).skip(3).limit(6); db.myColl.find().sort({_id: 1}).limit(6).skip(3);
Exemplo de paginação
Usando skip()
A função JavaScript a seguir usa skip() para paginar uma coleção pelo seu campo _id:
function printStudents(pageNumber, nPerPage) { print( "Page: " + pageNumber ); db.students.find() .sort( { _id: 1 } ) .skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 ) .limit( nPerPage ) .forEach( student => { print( student.name ); } ); }
O método skip() exige que o servidor verifique desde o início do conjunto de resultados de entrada antes de começar a retornar resultados. À medida que a compensação aumenta, skip() ficará mais lento.
Usando queries de intervalo
As queries do intervalo podem usar índices para evitar a digitalização de documentos indesejados, geralmente gerando melhor desempenho à medida que a compensação aumenta, em comparação com o uso de skip() na paginação.
Ordem decrescente
Use este procedure para implementar a pagination com querys de intervalo:
Escolha um campo como
_idque geralmente muda em uma direção consistente ao longo do tempo e tem um índice único para evitar valores duplicados,Query de documentos cujo campo é menor que o valor inicial usando os operadores
$ltesort(), eCArmazene o valor do último field seen para a próxima query.
Por exemplo, a função a seguir usa o procedimento acima para imprimir páginas de nomes de estudantes de uma coleção, classificadas aproximadamente na ordem dos documentos mais recentes, usando primeiro o campo _id (ou seja, em ordem decrescente):
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $lt: startValue } } ) .sort( { _id: -1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
Em seguida, você pode usar o código a seguir para imprimir todos os nomes dos alunos usando essa função de paginação, usando MaxKey para começar com a maior chave possível:
let currentKey = MaxKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }
Observação
Embora os valores de ObjectId devam aumentar ao longo do tempo, eles não são necessariamente monotônicos. Isso ocorre porque eles:
Contêm apenas um segundo de resolução temporal, portanto, os valores de ObjectId criados no mesmo segundo não têm uma ordem garantida e
São gerados por clientes, que podem ter relógios de sistema diferentes.
Ordem ascendente
O retorno de resultados paginados em ordem crescente é semelhante ao anterior, mas usa $gt com uma ordem de classificação crescente:
function printStudents(startValue, nPerPage) { let endValue = null; db.students.find( { _id: { $gt: startValue } } ) .sort( { _id: 1 } ) .limit( nPerPage ) .forEach( student => { print( student.name ); endValue = student._id; } ); return endValue; }
O uso desta função também é semelhante, mas com MinKey como a chave inicial:
let currentKey = MinKey; while (currentKey !== null) { currentKey = printStudents(currentKey, 10); }