Obtenir les derniers N enregistrements dans MongoDB

Mehvish Ashiq 13 juin 2022
Obtenir les derniers N enregistrements dans MongoDB

Ce tutoriel explorera le nombre de façons d’obtenir les N derniers enregistrements dans MongoDB, où N est un nombre positif et supérieur à zéro. Nous allons voir comment récupérer le nombre de documents avec et sans tri.

Obtenir les derniers N enregistrements dans MongoDB

Nous devons avoir une collection contenant des documents pour continuer avec les exemples pratiques. Alors, allons de l’avant et utilisons les requêtes suivantes pour créer une collection et y insérer quelques documents.

Exemple de code :

> 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();

PRODUCTION:

{ "_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 }

Maintenant, nous avons notre collection prête et remplie. Le point est de déterminer si nous voulons obtenir les N derniers enregistrements des documents insérés les plus récents aux moins récents ou vice versa.

Apprenons chacun des scénarios donnés ci-dessous.

Obtenez les N derniers enregistrements des documents insérés les plus récents aux moins récents ou vice versa

Avant de continuer, jetez un œil aux deux termes suivants pour les comprendre facilement :

  1. Tri du plus récent au moins récent

    Cela signifie Last In First Out (ordre décroissant). Les documents insérés en dernier seront affichés en premier.

  2. Tri du moins récent au plus récent

    Cela signifie premier entré, premier sorti (ordre croissant). Les documents insérés en premier seront affichés en premier.

Utilisez la méthode cursor.sort() pour obtenir les N derniers enregistrements des documents insérés les plus récents aux moins récents ou vice versa

Exemple de code (dernier entré, premier sorti) :

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

PRODUCTION:

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

Exemple de code (premier entré, premier sorti) :

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

PRODUCTION:

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

Ici, nous utilisons la méthode sort() pour trier les documents du plus récent au moins récent ordre d’insertion (ordre décroissant). Ainsi, nous appliquons la méthode sort() au curseur avant d’obtenir des documents (enregistrements) de la base de données.

La méthode sort() a pour paire champ-valeur {champ : valeur}, et nous pouvons effectuer un tri sur un maximum de 32 clés. Les documents ne sont pas stockés dans un ordre spécifié dans une collection lors de l’utilisation de MongoDB.

C’est pourquoi, lorsque nous effectuons un tri sur un champ particulier avec des valeurs en double, les documents avec ces valeurs peuvent être renvoyés dans n’importe quel ordre. Pour obtenir un tri cohérent, nous devons inclure au moins un champ contenant les valeurs uniques.

Le moyen le plus simple de s’en assurer est d’avoir le champ _id dans la méthode sort().

La limit(N) est utilisée pour obtenir le nombre de documents spécifié. Nous pouvons omettre cette fonction si nous souhaitons obtenir tous les documents triés.

Alternativement, nous pouvons également utiliser la requête comme suit sans avoir de champ particulier.

Exemple de code :

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

PRODUCTION:

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

Le $natural fonctionne comme First In First Out et Last In First Out si leurs valeurs sont respectivement 1 et 1. Nous pouvons l’utiliser si nous avons la version 4.4 ou supérieure de MongoDB.

Utilisez les étapes $sort et $limit (agrégation) pour obtenir les N derniers enregistrements des documents insérés les plus récents aux moins récents ou vice versa

Exemple de code (dernier entré, premier sorti) :

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

PRODUCTION:

{ "_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 }

Exemple de code (premier entré, premier sorti) :

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

PRODUCTION:

{ "_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 }

L’étape d’agrégation $sort est similaire à la méthode cursor.sort(). Il est utilisé pour trier tous les documents et les renvoie dans un ordre trié vers un pipeline.

Il prend un document ayant le nom du champ et l’ordre de tri respectif. Rappelez-vous que 1 et 1 sont utilisés pour l’ordre croissant et décroissant.

Comme la méthode cursor.sort(), nous pouvons utiliser l’étape d’agrégation $sort pour trier sur un maximum de 32 clés et avoir au moins un champ (contenant des valeurs uniques) pour un ordre de tri cohérent.

L’ordre de tri est évalué de gauche à droite si nous sommes amenés à trier sur plusieurs champs. Tandis que le $limit prend un nombre qui indique combien de documents doivent être imprimés à l’écran ; également, il a une limite entière de 64 bits.

Utilisez les méthodes skip() et count() ensemble pour obtenir les N derniers enregistrements dans MongoDB

Cette approche est captivante car nous ne trions pas les données mais récupérons une section de documents du début ou de la fin, en tenant compte des exigences du projet.

Exemple de code (obtenir les 3 premiers enregistrements sans trier les documents) :

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

PRODUCTION:

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

Exemple de code (obtenir les 3 derniers enregistrements sans trier les documents) :

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

PRODUCTION:

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

Dans cet exemple, nous utilisons db.stock.count() pour compter le nombre total de documents, en soustrayons 3 et sautons tous en utilisant la méthode skip().

N’oubliez pas que le nombre de documents que nous avons soustrait n’est pas ignoré (dans ce cas, il s’agit de 3). Ces 3 documents que nous obtiendrons en conséquence.

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