MongoDB Expression régulière ($regex) avec exemples

⚡ Résumé intelligent

MongoDB Les expressions régulières effectuent une correspondance de modèles pour trouver des chaînes de caractères dans les documents, en utilisant l'opérateur $regex, l'indicateur $options pour l'insensibilité à la casse, les ancres pour les correspondances exactes et les délimiteurs de barre oblique lorsque la valeur exacte du champ est inconnue.

  • 🔍 $regex Operator: db.collection.find({field:{$regex:”pattern”}}) correspond aux documents contenant le modèle.
  • (I.e. Anchors: ^ et $ imposent des correspondances exactes, en liant le modèle au début et à la fin de la chaîne.
  • (I.e. Insensibilité à la casse : L'indicateur 'i' de $options correspond au texte, qu'il soit en majuscules ou en minuscules.
  • (I.e. Délimiteurs de barres obliques : enveloppeping un motif dans /…/ correspond sans écrire l'opérateur $regex.
  • (I.e. Derniers N documents : Combinez sort({_id:-1}) avec limit(n) pour renvoyer les enregistrements les plus récents.
  • 🤖 Assistance IA : Les assistants créent des modèles d'expressions régulières et signalent les coûts de performance liés à l'analyse complète de la collection.

MongoDB Expression régulière (Regex)

Les expressions régulières sont utilisées pour la correspondance de modèles, c'est-à-dire pour trouver des chaînes de caractères dans des 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

L'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 une collection Employee identique, comportant les champs « Employeeid » et « EmployeeName ». Supposons également que notre collection contienne les documents suivants.

Identifiant de l'employé Nom de l'employé
22 NouveauMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Vieux

Dans le code ci-dessous, nous avons utilisé l'opérateur $regex pour spécifier les critères de recherche.

Utiliser $regex OperaTor pour la correspondance de motifs

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code Explication:

  1. Nous souhaitons ici trouver tous les noms d'employés contenant le caractère « Gu ». Pour ce faire, nous utilisons l'opérateur $regex afin de définir le critère de recherche « Gu ».
  2. 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 :

Utiliser $regex OperaTor pour la correspondance de motifs

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, ainsi qu'un document supplémentaire contenant le nom de l'employé sous la forme «Guru999”. Si vous avez saisi les critères de recherche comme «Guru99”, il renverrait également le document qui avait «Guru999". Mais supposons que nous ne voulions pas cela et que nous voulions seulement renvoyer le document avec «Guru99". Nous pouvons alors procéder par correspondance de motif exacte. Pour ce faire, nous utiliserons les caractères ^ et $. Nous ajouterons le caractère ^ au début de la chaîne et le caractère $ à la fin.

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é.

Utiliser $regex OperaTor pour la correspondance de motifs

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code Explication:

  1. Dans les critères de recherche, nous utilisons ici les caractères ^ et $. Le ^ permet de s'assurer que la chaîne commence par un certain caractère, et le $ permet de s'assurer qu'elle se termine par un certain caractère. Ainsi, lors de l'exécution du code, seule la chaîne nommée « » sera récupérée.Guru99 ".
  2. 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 :

Utiliser $regex OperaTor pour la correspondance de motifs

Dans le résultat, il est clairement visible que la chaîne «Guru« 99 » est récupéré.

Correspondance de motifs avec $options

Lorsqu'on utilise l'opérateur $regex, on peut également fournir des options supplémentaires en utilisant $ 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 le paramètre d'insensibilité à la casse.

L'exemple suivant montre comment cela peut être réalisé.

Supposons que nous ayons la même collection Employee qui comporte les noms de champs « 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

Si nous exécutons la même requête que dans le sujet précédent, le document contenant « GURU99 » n'apparaîtra jamais dans les résultats. Pour qu'il figure dans le jeu de résultats, il faut ajouter le paramètre « i » à l'option `$options`.

Correspondance de motifs avec $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code Explication:

  1. L'option $options avec le paramètre 'i' (qui signifie insensibilité à la casse) spécifie que nous voulons effectuer la recherche, que nous trouvions les lettres 'Gu' en minuscules ou en majuscules.

Si la commande est exécutée avec succès, la sortie suivante s'affichera :

Sortie :

Correspondance de motifs avec $options

  1. Les résultats montrent clairement que même si un document contient la lettre « Gu » en majuscules, il apparaît tout de même dans l'ensemble de résultats.

Correspondance de modèles sans l'opérateur regex

Il est également possible d'effectuer une correspondance de motifs sans l'opérateur $regex. L'exemple suivant illustre comment procéder.

Correspondance de modèles sans Regex Operator

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code Explication:

  1. Les délimiteurs « // » servent à préciser vos critères de recherche. Ainsi, nous spécifions /Gu/ pour retrouver les documents dont le nom d'employé contient « Gu ».

Si la commande est exécutée avec succès, la sortie suivante s'affichera :

Sortie :

Correspondance de modèles sans Regex Operator

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 méthodes en suivant les étapes suivantes.

L'exemple suivant montre comment cela peut être réalisé.

Supposons que nous ayons la même collection Employee qui comporte les noms de champs « 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

Récupération des n derniers documents d'une collection

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code Explication:

  1. Lors de la recherche de documents, utilisez la fonction de tri pour trier les enregistrements par ordre décroissant selon la valeur du champ _id dans la collection. L'option -1 indique que les documents doivent être triés par ordre décroissant, le dernier document apparaissant alors en premier.
  2. Utilisez ensuite la clause LIMIT pour n'afficher que le nombre d'enregistrements souhaités. Ici, nous avons défini la clause LIMIT (2), ce qui permettra de récupérer les deux derniers documents.

Si la commande est exécutée avec succès, la sortie suivante s'affichera :

Sortie :

Récupération des n derniers documents d'une collection

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.

FAQ

Anchor le motif avec ^ et $. Le motif « ^ »Guru99$ » correspond uniquement à «Guru99” et rejette «Guru999”, car ^ lie le début de la chaîne et $ lie la fin.

Seuls les motifs sensibles à la casse et préfixés par ^ utilisent efficacement un index. Les motifs non ancrés ou insensibles à la casse déclenchent une analyse complète de la collection ; il est donc conseillé d’ancrer le préfixe autant que possible.

Faites précéder les métacaractères tels que le point, l'astérisque, le plus ou les crochets d'une barre oblique inverse. Par exemple, pour l'extension littérale « .com », le point est échappé afin qu'il ne soit pas interprété comme un caractère.

La fonction `$regex` permet une correspondance de motifs flexible sur un champ et peut analyser l'ensemble de la collection. La fonction `$text` utilise un index de texte pour une recherche rapide par mot-clé dans les champs indexés, mais ne prend pas en charge les motifs de sous-chaînes partielles.

Oui. Lorsque la chaîne de recherche dépasse environ 38 000 caractères, la requête risque de ne pas renvoyer de résultats corrects. Pour une correspondance fiable, veillez à ce que les modèles et les champs cibles restent dans cette limite.

Stockez une copie en minuscules du champ pour les recherches insensibles à la casse, ancrez les modèles avec ^ et préférez un index de texte ou Atlas Search sur les grandes collections plutôt que $regex non ancré.

Les assistants IA transforment les règles en langage clair en modèles $regex, ajoutent les ancres et l'indicateur $options corrects, et avertissent lorsqu'une requête déclenchera une analyse complète et lente de la collection.

Oui. Un copilote IA réécrit les modèles non ancrés, recommande un index de texte ou une recherche Atlas et convertit les expressions régulières insensibles à la casse en une recherche de champ en minuscules pour plus de rapidité.

Résumez cet article avec :