Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

cursor.skip()

Nesta página

  • Definição
  • Comportamento
  • Exemplo de paginação
cursor.skip(<offset>)

Importante

Método mongosh

Este é um método mongosh . Esta não é a documentação de Node.js ou de outros métodos de driver específicos da linguagem de programação.

Na maioria dos casos, métodos mongosh funcionam da mesma forma que os métodos legados do shell mongo . No entanto, alguns métodos legados não estão disponíveis em mongosh.

Para a documentação do shell legado mongo, consulte a documentação para a release correspondente do MongoDB Server:

Para drivers de API do MongoDB, consulte a documentação do driver MongoDB específica do idioma.

Ligue para o método skip() em um cursor para controlar onde 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âmetro
Tipo
Descrição
offset
número
O número de documentos a ignorar no conjunto de resultados.

Se estiver usando skip() com sort(), certifique-se de incluir pelo menos um campo em sua classificação que contenha valores únicos, 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.

Quando você agrupa skip() e limit(), o método de ordem de cadeia 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 devem ser devolvidos.

O seguinte exemplo de código mostra diferentes pedidos de cadeia para skip() e limit() que sempre produzem os mesmos resultados de querypara 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);

A função JavaScript a seguir usa skip() para paginar uma coleção pelo 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() requer que o servidor verifique desde o início do conjunto de entrada antes de começar a retornar resultados. À medida que a compensação aumenta, skip() se tornará mais lenta.

As queries de intervalo podem usar índices para evitar a digitalização de documentos indesejados, geralmente gerando melhor desempenho à medida que o deslocamento aumenta, em comparação com o uso de skip() para paginação.

Use este procedure para implementar a pagination com querys de intervalo:

  • Escolha um campo como _id que 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 $lt e sort(), eC

  • Armazene 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.

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);
}
← cursor.size()