MongoDB Expression régulière (Regex) avec exemples
Les expressions régulières sont utilisées pour la correspondance de modèles, qui concerne essentiellement les chaînes de résultats dans les documents.
Parfois, lors de la récupération de documents dans une collection, vous ne savez peut-être pas exactement quelle est la valeur exacte du champ à rechercher. Par conséquent, on peut utiliser des expressions régulières pour aider à récupérer des données en fonction des valeurs de recherche de correspondance de modèles.
Utilisation de l'opérateur $regex pour la correspondance de modèles
Vue d'ensemble opérateur regex dans MongoDB est utilisé pour rechercher des chaînes spécifiques dans la collection. L'exemple suivant montre comment cela peut être réalisé.
Supposons que nous ayons notre même collection Employee qui porte les noms de champ « Employeeid » et « EmployeeName ». Supposons également que nous ayons les documents suivants dans notre collection.
Identifiant de l'employé | Nom de l'employé |
---|---|
22 | NouveauMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Vieux |
Ici, dans le code ci-dessous, nous avons utilisé l'opérateur regex pour spécifier les critères de recherche.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Explication du code :
- Ici, nous voulons trouver tous les noms d'employés contenant les caractères « Gu ». Par conséquent, nous spécifions l'opérateur $regex pour définir les critères de recherche de 'Gu'
- Le printjson est utilisé pour mieux imprimer chaque document renvoyé par la requête.
Si la commande est exécutée avec succès, la sortie suivante s'affichera :
Sortie :
Le résultat montre clairement que les documents dans lesquels le nom de l'employé contient les caractères « Gu » sont renvoyés.
Supposons que votre collection contienne les documents suivants avec un document supplémentaire contenant le nom de l'employé comme « Guru999 ». Si vous avez entré les critères de recherche comme « Guru99 », le document contenant « Guru999 » sera également renvoyé. Mais supposons que nous ne voulions pas cela et voulions seulement renvoyer le document avec « Guru99 ». Ensuite, nous pouvons le faire avec une correspondance exacte de modèles. Pour effectuer une correspondance de modèle exacte, nous utiliserons les caractères ^ et $. Nous ajouterons le caractère ^ au début de la chaîne et $ à la fin de la chaîne.
Identifiant de l'employé | Nom de l'employé |
---|---|
22 | NouveauMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Vieux |
8 | Guru999 |
L'exemple suivant montre comment cela peut être réalisé.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Explication du code :
- Ici dans les critères de recherche, nous utilisons les caractères ^ et $. Le ^ est utilisé pour garantir que la chaîne commence par un certain caractère, et $ est utilisé pour garantir que la chaîne se termine par un certain caractère. Ainsi, lorsque le code s'exécutera, il récupérera uniquement la chaîne portant le nom « Guru99 ».
- Le printjson est utilisé pour mieux imprimer chaque document renvoyé par la requête.
Si la commande est exécutée avec succès, la sortie suivante s'affichera :
Sortie :
Dans la sortie, il est clairement visible que la chaîne « Guru99 » est récupérée.
Correspondance de motifs avec $options
Lorsque vous utilisez l'opérateur regex, vous pouvez également fournir des options supplémentaires en utilisant l'opérateur $ options mot-clé. Par exemple, supposons que vous souhaitiez rechercher tous les documents contenant « Gu » dans leur nom d'employé, qu'ils soient sensibles ou non à la casse. Si un tel résultat est souhaité, nous devons alors utiliser le $ options avec paramètre d'insensibilité à la casse.
L'exemple suivant montre comment cela peut être réalisé.
Supposons que nous ayons notre même collection Employee qui porte les noms de champ « Employeeid » et « EmployeeName ».
Supposons également que nous ayons les documents suivants dans notre collection.
Identifiant de l'employé | Nom de l'employé |
---|---|
22 | NouveauMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Vieux |
7 | GOUROU99 |
Maintenant, si nous exécutons la même requête que dans le sujet précédent, nous ne verrons jamais le document avec « GURU99 » dans le résultat. Pour garantir que cela figure dans le jeu de résultats, nous devons ajouter le paramètre $options « I ».
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Explication du code :
- Le paramètre $options avec le paramètre 'I' (qui signifie insensibilité à la casse) précise que l'on veut effectuer la recherche peu importe si l'on trouve les lettres 'Gu' en minuscules ou en majuscules.
Si la commande est exécutée avec succès, la sortie suivante s'affichera :
Sortie :
- Le résultat montre clairement que même si un document comporte la majuscule « Gu », le document est toujours affiché dans le jeu de résultats.
Correspondance de modèles sans l'opérateur regex
On peut également effectuer une correspondance de modèles sans l'opérateur regex. L'exemple suivant montre comment cela peut être réalisé.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Explication du code :
- Les options « // » signifient essentiellement de spécifier vos critères de recherche à l'intérieur de ces délimiteurs. Par conséquent, nous spécifions /Gu/ pour retrouver les documents qui ont « Gu » dans leur EmployeeName.
Si la commande est exécutée avec succès, la sortie suivante s'affichera :
Sortie :
Le résultat montre clairement que les documents dans lesquels le nom de l'employé contient les caractères « Gu » sont renvoyés.
Récupérer les derniers « n » documents d'une collection
Il existe différentes manières d’obtenir les n derniers documents d’une collection.
Examinons l'une des façons via les étapes suivantes
L'exemple suivant montre comment cela peut être réalisé.
Supposons que nous ayons notre même collection Employee qui porte les noms de champ « Employeeid » et « EmployeeName ».
Supposons également que nous ayons les documents suivants dans notre collection :
Identifiant de l'employé | Nom de l'employé |
---|---|
22 | NouveauMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Vieux |
7 | GOUROU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Explication du code :
1) Lors de la recherche des documents, utilisez la fonction de tri pour trier les enregistrements dans l'ordre inverse en fonction de la valeur du champ _id dans la collection. Le -1 indique essentiellement de trier les documents dans l'ordre inverse ou décroissant afin que le dernier document devienne le premier document à afficher.
2) Utilisez ensuite la clause limite pour afficher simplement le nombre d’enregistrements souhaités. Ici, nous avons défini la clause limite (2), elle récupérera donc les deux derniers documents.
Si la commande est exécutée avec succès, la sortie suivante s'affichera :
Sortie :
Le résultat montre clairement que les deux derniers documents de la collection sont affichés. Nous avons donc clairement montré que pour récupérer les « n » derniers documents de la collection, nous pouvons d'abord trier les documents par ordre décroissant, puis utiliser la clause limite pour renvoyer le nombre « n » de documents requis.
Note: Si la recherche est effectuée sur une chaîne supérieure à, disons, 38,000 caractères, elle n'affichera pas les bons résultats.
Résumé
- La correspondance de modèles peut être obtenue par l'opérateur $regex. Cet opérateur peut être utilisé pour rechercher certaines chaînes de la collection.
- Les symboles ^ et $ peuvent être utilisés pour des recherches de texte exactes, ^ étant utilisé pour s'assurer que la chaîne commence par un certain caractère et $ utilisé pour garantir que la chaîne se termine par un certain caractère.
- Le « i » ainsi que l'opérateur $regex peuvent être utilisés pour spécifier l'insensibilité à la casse afin que les chaînes puissent être recherchées, qu'elles soient en minuscules ou en majuscules.
- Les délimiteurs // peuvent également être utilisés pour la correspondance de modèles.
- Utilisez une combinaison de sort et de fonction limit pour renvoyer les n derniers documents de la collection. La fonction de tri peut être utilisée pour renvoyer les documents par ordre décroissant, après quoi la clause limite peut être utilisée pour limiter le nombre de documents renvoyés.