Obtenga los últimos N registros en MongoDB

Mehvish Ashiq 13 junio 2022
Obtenga los últimos N registros en MongoDB

Este tutorial explorará la cantidad de formas de obtener los últimos N registros en MongoDB, donde N es un número positivo y mayor que cero. Veremos cómo recuperar el número de documentos con y sin ordenar.

Obtenga los últimos N registros en MongoDB

Debemos tener una colección que contenga documentos para continuar con los ejemplos prácticos. Entonces, avancemos y usemos las siguientes consultas para crear una colección e insertar algunos documentos en ella.

Código de ejemplo:

> use get_n_records;
> db.createCollection('stock');
> db.stock.insertMany([
    {"item": "abc", "quantity": 12},
    {"item": "def", "quantity": 234},
    {"item": "ghi", "quantity": 45},
    {"item": "jkl", "quantity": 345},
    {"item": "mno", "quantity": 243},
    {"item": "pqr", "quantity": 345},
    {"item": "stu", "quantity": 56},
    {"item": "vwx", "quantity": 575},
    {"item": "yzz", "quantity": 398}
]);
> db.stock.find();

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e75fb"), "item" : "abc", "quantity" : 12 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fc"), "item" : "def", "quantity" : 234 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fd"), "item" : "ghi", "quantity" : 45 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fe"), "item" : "jkl", "quantity" : 345 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75ff"), "item" : "mno", "quantity" : 243 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7600"), "item" : "pqr", "quantity" : 345 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7601"), "item" : "stu", "quantity" : 56 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7602"), "item" : "vwx", "quantity" : 575 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7603"), "item" : "yzz", "quantity" : 398 }

Ahora, tenemos nuestra colección lista y poblada. El punto es considerar si queremos obtener los últimos N registros de los documentos insertados más recientes a los menos recientes o viceversa.

Aprendamos cada uno de los escenarios que se dan a continuación.

Obtenga los últimos N registros de los documentos insertados más recientes a los menos recientes o viceversa

Antes de continuar, echa un vistazo a los siguientes dos términos para entenderlos fácilmente:

  1. Clasificación de más reciente a menos reciente

    Significa Last In First Out (orden descendente). Los documentos insertados en el último se mostrarán primero.

  2. Clasificación de menos reciente a más reciente

    Significa First In First Out (primero en entrar, primero en salir) (orden ascendente). Los documentos insertados primero se mostrarán primero.

Utilice el método cursor.sort() para obtener los últimos N registros de los documentos insertados más recientes a los menos recientes o viceversa

Código de ejemplo (último en entrar, primero en salir):

> db.stock.find().sort({_id:-1}).limit(3);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e7603"), "item" : "yzz", "quantity" : 398 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7602"), "item" : "vwx", "quantity" : 575 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7601"), "item" : "stu", "quantity" : 56 }

Código de ejemplo (primero en entrar, primero en salir):

> db.stock.find().sort({_id:1}).limit(3);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e75fb"), "item" : "abc", "quantity" : 12 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fc"), "item" : "def", "quantity" : 234 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fd"), "item" : "ghi", "quantity" : 45 }

Aquí, usamos el método sort() para clasificar los documentos del orden de inserción más reciente al menos reciente (orden descendente). Entonces, estamos aplicando el método sort() al cursor antes de obtener cualquier documento (registros) de la base de datos.

El método sort() tiene el par campo-valor como {field: value}, y podemos realizar una ordenación sobre un máximo de 32 claves. Los documentos no se almacenan en un orden específico en una colección mientras se usa MongoDB.

Es por eso que cuando realizamos una clasificación en un campo en particular con valores duplicados, los documentos con esos valores pueden devolverse en cualquier orden. Para obtener una ordenación consistente, debemos incluir al menos un campo que contenga los valores únicos.

La forma más fácil de asegurar esto es tener el campo _id en el método sort().

El limit(N) se utiliza para obtener el número especificado de documentos. Podemos omitir esta función si estamos interesados ​​en obtener todos los documentos ordenados.

Alternativamente, también podemos usar la consulta de la siguiente manera sin tener un campo en particular.

Código de ejemplo:

> db.stock.find().sort({$natural:1}).limit(3);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e75fb"), "item" : "abc", "quantity" : 12 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fc"), "item" : "def", "quantity" : 234 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fd"), "item" : "ghi", "quantity" : 45 }

El $natural funciona como Primero en entrar, primero en salir y Último en entrar, primero en salir si su valor es 1 y -1, respectivamente. Podemos usarlo si tenemos la versión 4.4 o superior de MongoDB.

Utilice las etapas $sort y $limit (agregación) para obtener los últimos N registros de los documentos insertados más recientes a los menos recientes o viceversa

Código de ejemplo (último en entrar, primero en salir):

> db.stock.aggregate([
     { $sort : { _id : -1 } },
     { $limit : 4 }
]);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e7603"), "item" : "yzz", "quantity" : 398 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7602"), "item" : "vwx", "quantity" : 575 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7601"), "item" : "stu", "quantity" : 56 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7600"), "item" : "pqr", "quantity" : 345 }

Código de ejemplo (primero en entrar, primero en salir):

> db.stock.aggregate([
     { $sort : { _id : 1 } },
     { $limit : 4 }
]);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e75fb"), "item" : "abc", "quantity" : 12 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fc"), "item" : "def", "quantity" : 234 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fd"), "item" : "ghi", "quantity" : 45 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fe"), "item" : "jkl", "quantity" : 345 }

La etapa de agregación $sort es similar al método cursor.sort(). Se utiliza para ordenar todos los documentos y devolverlos ordenados a una pipeline.

Se necesita un documento que tenga el nombre del campo y el respectivo orden de clasificación. Recuerda que 1 y -1 se utilizan para orden ascendente y descendente.

Al igual que el método cursor.sort(), podemos usar la etapa de agregación $sort para ordenar un máximo de 32 claves y tener al menos un campo (que contenga valores únicos) para un orden de clasificación consistente.

El orden de clasificación se evalúa de izquierda a derecha si es necesario ordenar en varios campos. Mientras que el $limit toma un número que muestra cuántos documentos se deben imprimir en pantalla; además, tiene un límite de enteros de 64 bits.

Use los métodos skip() y count() juntos para obtener los últimos N registros en MongoDB

Este enfoque es cautivador porque no estamos clasificando los datos, sino obteniendo una sección de documentos desde el principio o el final, teniendo en cuenta los requisitos del proyecto.

Código de ejemplo (Obtenga los primeros 3 registros sin ordenar los documentos):

> db.stock.find().limit(3);

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e75fb"), "item" : "abc", "quantity" : 12 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fc"), "item" : "def", "quantity" : 234 }
{ "_id" : ObjectId("629ac651b7e637e64d8e75fd"), "item" : "ghi", "quantity" : 45 }

Código de ejemplo (Obtenga los últimos 3 registros sin ordenar los documentos):

> db.stock.find().skip(db.stock.count() - 3)

Producción :

{ "_id" : ObjectId("629ac651b7e637e64d8e7601"), "item" : "stu", "quantity" : 56 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7602"), "item" : "vwx", "quantity" : 575 }
{ "_id" : ObjectId("629ac651b7e637e64d8e7603"), "item" : "yzz", "quantity" : 398 }

En este ejemplo, usamos db.stock.count() para contar el número total de documentos, restamos 3 de ellos y omitimos todos usando el método skip().

Recuerda, no se salta el número de documentos que restamos (en este caso son 3). Estos 3 documentos los obtendremos como resultado.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - MongoDB Record