sql >> Base de Datos >  >> NoSQL >> MongoDB

2 formas de limitar los documentos devueltos en MongoDB

Cuando ejecuta consultas en MongoDB, tiene la opción de limitar los documentos devueltos. Aquí es donde se especifica un número máximo de documentos que la operación devolverá.

Por ejemplo, si una operación devolvería normalmente 2000 documentos, pero especifica un límite de 1000, solo se devolverán 1000 documentos. Sin embargo, si la operación solo devuelve, por ejemplo, 500 documentos, entonces se devuelven los 500 (porque no superan el límite de 1000 documentos).

Esto es un poco como usar el TOP cláusula en SQL Server, o el LIMIT cláusula en MySQL, MariaDB, PostgreSQL y SQLite.

Limitar los documentos devueltos puede ayudar a mejorar el rendimiento al evitar que se devuelvan y procesen más documentos de los necesarios.

En MongoDB, podemos usar el cursor.limit() método o el $limit operador de agregación para limitar los documentos devueltos.

El cursor.limit() Método

Supongamos que tenemos una colección llamada pets con los siguientes 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 el limit() para limitar el número de documentos devueltos al consultar esta colección.

Ejemplo:

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 }

El $limit Operador de agregación

Al usar la canalización de agregación, puede usar el $limit operador de agregación para limitar los resultados pasados ​​a la siguiente etapa en la canalización.

Ejemplo:

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    }
])

Ejemplo:

{ "_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, el $match operator no consistiría en un documento vacío como el que tenemos aquí. Normalmente incluiría una consulta con la que filtrar los resultados en esa parte de la canalización. Pero en este caso utilicé un documento vacío para que el ejemplo fuera más fácil de seguir.

Dado que pasé un documento vacío en la primera etapa, podría haber hecho esto:

db.pets.aggregate([
     { 
      $limit : 3
    }
])

De cualquier manera, el resultado se limitó a solo 3 documentos.

Cuando se usa en la canalización de agregación, el $limit el operador podría estar en algún lugar en el medio de la tubería. Si es así, pasa los documentos limitados a la siguiente etapa.

Aquí hay un ejemplo para ilustrar lo que quiero decir.

db.pets.aggregate([
    {
      $match: { }
    },
     { 
      $limit : 3
    },
    {
      $match: { "type": "Cat" }
    }
])

Resultado:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

Solo un gato estaba en los resultados limitados (a pesar de que hay dos gatos en el documento original), por lo que solo ese gato fue emparejado en la tercera etapa.

Esto es diferente a hacer lo siguiente.

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 }

En este caso, buscamos gatos en el documento original y luego limitamos los resultados a solo 3. Dado que solo hay 2 gatos, el $limit no tuvo impacto en el resultado.

Limitación de documentos ordenados

Si limita los resultados después de clasificar los documentos, el límite tendrá en cuenta la clasificación.

Ejemplo:

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 }

En este caso, ordené todos los documentos por su _id campo en orden descendente (el -1 especifica el orden descendente).

Aquí está de nuevo en orden ascendente (un valor de 1 especifica el orden ascendente):

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 }

Al limitar los resultados después de haberlos ordenado explícitamente, asegúrese de que la operación de ordenación haya utilizado una ordenación estable.

Una clasificación estable es aquel que devuelve el mismo orden de clasificación cada vez que se realiza. Un tipo inestable por otro lado, es uno que puede devolver un orden de clasificación diferente cuando se realiza varias veces.

Para asegurarse de que está realizando una ordenación estable, incluya al menos un campo en su ordenación que contenga exclusivamente valores únicos (por ejemplo, el _id campo).

Más información

Para obtener más información, consulte la documentación de MongoDB para:

  • cursor.limit()
  • $limit (agregación)