MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

2 maneiras de limitar os documentos retornados no MongoDB


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)