Ao executar consultas no MongoDB, você tem a opção de limitar os documentos retornados. É aqui que você especifica um número máximo de documentos a serem retornados pela operação.
Por exemplo, se uma operação normalmente retornar 2.000 documentos, mas você especificar um limite de 1.000, apenas 1.000 documentos serão retornados. No entanto, se a operação retornar apenas, digamos, 500 documentos, todos os 500 serão retornados (porque eles não violam o limite de 1.000 documentos).
Isso é um pouco como usar o
TOP
cláusula no SQL Server ou o LIMIT
cláusula em MySQL, MariaDB, PostgreSQL e SQLite. Limitar os documentos devolvidos pode ajudar a melhorar o desempenho, evitando que mais documentos sejam devolvidos e processados do que o necessário.
No MongoDB, podemos usar o
cursor.limit()
método ou o $limit
operador de agregação para limitar os documentos devolvidos. O cursor.limit()
Método
Suponha que tenhamos uma coleção chamada
pets
com os seguintes documentos:{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
Podemos usar o
limit()
método para limitar o número de documentos retornados ao consultar esta coleção. Exemplo:
db.pets.find().limit(3)
Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
O $limit
Operador de agregação
Ao usar o pipeline de agregação, você pode usar o
$limit
operador de agregação para limitar os resultados passados para o próximo estágio no pipeline. Exemplo:
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
}
])
Exemplo:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Normalmente, o
$match
operador não consistiria em um documento vazio como temos aqui. Normalmente incluiria uma consulta com a qual filtrar os resultados nessa parte do pipeline. Mas neste caso eu usei um documento vazio para tornar o exemplo mais fácil de seguir. Dado que passei um documento vazio no primeiro estágio, eu poderia ter feito isso:
db.pets.aggregate([
{
$limit : 3
}
])
De qualquer forma, o resultado foi limitado a apenas 3 documentos.
Quando usado no pipeline de agregação, o
$limit
operador pode estar em algum lugar no meio do pipeline. Em caso afirmativo, ele passa os documentos limitados para a próxima etapa. Aqui está um exemplo para ilustrar o que quero dizer.
db.pets.aggregate([
{
$match: { }
},
{
$limit : 3
},
{
$match: { "type": "Cat" }
}
])
Resultado:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Apenas um gato estava nos resultados limitados (embora existam dois gatos no documento original), então apenas esse gato foi correspondido no terceiro estágio.
Isso é diferente de fazer o seguinte.
db.pets.aggregate([
{
$match: { "type": "Cat" }
},
{
$limit : 3
}
])
Resultado:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
Nesse caso, procuramos gatos no documento original e limitamos os resultados a apenas 3. Como existem apenas 2 gatos, o
$limit
não teve impacto no resultado. Limitação de documentos classificados
Se você limitar os resultados após a classificação dos documentos, o limite levará em consideração a classificação.
Exemplo:
db.pets.aggregate([
{
$sort: { "_id": -1 }
},
{
$limit : 3
}
])
Resultado:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
Nesse caso, classifiquei todos os documentos por
_id
campo em ordem decrescente (o -1
especifica a ordem decrescente). Aqui está novamente em ordem crescente (um valor de
1
especifica a ordem crescente):db.pets.aggregate([
{
$sort: { "_id": 1 }
},
{
$limit : 3
}
])
Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Ao limitar os resultados depois de serem classificados explicitamente, certifique-se de que a operação de classificação tenha usado uma classificação estável.
Uma classificação estável é aquele que retorna a mesma ordem de classificação toda vez que é executado. Uma classificação instável por outro lado, é aquele que pode retornar uma ordem de classificação diferente quando executado várias vezes.
Para garantir que você esteja realizando uma classificação estável, inclua pelo menos um campo em sua classificação que contenha valores exclusivos (por exemplo, o
_id
campo). Mais informações
Para obter mais informações, consulte a documentação do MongoDB para:
cursor.limit()
$limit
(agregação)