MongoDB Κανονική έκφραση (Regex) με Παραδείγματα
Οι τυπικές εκφράσεις χρησιμοποιούνται για την αντιστοίχιση προτύπων, η οποία είναι βασικά για την εύρεση συμβολοσειρών εντός εγγράφων.
Μερικές φορές κατά την ανάκτηση εγγράφων σε μια συλλογή, ενδέχεται να μην γνωρίζετε ακριβώς ποια είναι η ακριβής τιμή πεδίου για αναζήτηση. Ως εκ τούτου, μπορεί κανείς να χρησιμοποιήσει κανονικές εκφράσεις για να βοηθήσει στην ανάκτηση δεδομένων με βάση τις τιμές αναζήτησης που ταιριάζουν με μοτίβο.
Χρήση τελεστή $regex για αντιστοίχιση μοτίβων
The τελεστής regex σε MongoDB χρησιμοποιείται για την αναζήτηση συγκεκριμένων συμβολοσειρών στη συλλογή. Το παρακάτω παράδειγμα δείχνει πώς μπορεί να γίνει αυτό.
Ας υποθέσουμε ότι έχουμε την ίδια συλλογή Υπαλλήλων που έχει τα ονόματα πεδίων "Employeeid" και "EmployeeName". Ας υποθέσουμε επίσης ότι έχουμε τα ακόλουθα έγγραφα στη συλλογή μας.
Ταυτότητα Υπαλλήλου | όνομα υπαλλήλου |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Γκουράνγκ |
Εδώ στον παρακάτω κώδικα χρησιμοποιήσαμε τον τελεστή regex για να καθορίσουμε τα κριτήρια αναζήτησης.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Επεξήγηση κώδικα:
- Εδώ θέλουμε να βρούμε όλα τα ονόματα εργαζομένων που έχουν τους χαρακτήρες «Gu». Ως εκ τούτου, καθορίζουμε τον τελεστή $regex για να ορίσουμε τα κριτήρια αναζήτησης του 'Gu'
- Το printjson χρησιμοποιείται για την εκτύπωση κάθε εγγράφου που επιστρέφεται από το ερώτημα με καλύτερο τρόπο.
Εάν η εντολή εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη έξοδος:
Παραγωγή:
Η έξοδος δείχνει ξεκάθαρα ότι επιστρέφονται εκείνα τα έγγραφα στα οποία το Όνομα Υπαλλήλου περιέχει τους χαρακτήρες «Gu».
Αν υποθέσουμε ότι η συλλογή σας έχει τα ακόλουθα έγγραφα με ένα πρόσθετο έγγραφο που περιείχε το Όνομα Υπαλλήλου ως "Guru999". Εάν εισαγάγατε τα κριτήρια αναζήτησης ως "Guru99", θα επέστρεφε επίσης το έγγραφο που είχε "Guru999". Αλλά ας υποθέσουμε ότι δεν το θέλαμε αυτό και θέλαμε να επιστρέψουμε μόνο το έγγραφο με το "Guru99". Τότε μπορούμε να το κάνουμε αυτό με ακριβή αντιστοίχιση προτύπων. Για να κάνουμε μια ακριβή αντιστοίχιση μοτίβων, θα χρησιμοποιήσουμε τον χαρακτήρα ^ και $. Θα προσθέσουμε τον χαρακτήρα ^ στην αρχή της συμβολοσειράς και $ στο τέλος της συμβολοσειράς.
Ταυτότητα Υπαλλήλου | όνομα υπαλλήλου |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Γκουράνγκ |
8 | Guru999 |
Το παρακάτω παράδειγμα δείχνει πώς μπορεί να γίνει αυτό.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Επεξήγηση κώδικα:
- Εδώ στα κριτήρια αναζήτησης, χρησιμοποιούμε τον χαρακτήρα ^ και $. Το ^ χρησιμοποιείται για να βεβαιωθείτε ότι η συμβολοσειρά ξεκινά με έναν συγκεκριμένο χαρακτήρα και το $ χρησιμοποιείται για να διασφαλιστεί ότι η συμβολοσειρά τελειώνει με έναν συγκεκριμένο χαρακτήρα. Έτσι, όταν εκτελεστεί ο κώδικας, θα φέρει μόνο τη συμβολοσειρά με το όνομα "Guru99".
- Το printjson χρησιμοποιείται για την εκτύπωση κάθε εγγράφου που επιστρέφεται από το ερώτημα με καλύτερο τρόπο.
Εάν η εντολή εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη έξοδος:
Παραγωγή:
Στην έξοδο, είναι καθαρά ορατό ότι έχει ληφθεί η συμβολοσειρά "Guru99".
Αντιστοίχιση μοτίβων με $επιλογές
Όταν χρησιμοποιείτε τον τελεστή regex, μπορείτε επίσης να παράσχετε πρόσθετες επιλογές χρησιμοποιώντας το $επιλογές λέξη-κλειδί. Για παράδειγμα, ας υποθέσουμε ότι θέλετε να βρείτε όλα τα έγγραφα που είχαν "Gu" στο Όνομα Υπαλλήλου τους, ανεξάρτητα από το αν ήταν διάκριση πεζών-κεφαλαίων ή χωρίς διάκριση. Εάν επιθυμούμε ένα τέτοιο αποτέλεσμα, τότε πρέπει να χρησιμοποιήσουμε το $επιλογές με παράμετρο μη ευαισθησίας πεζών-κεφαλαίων.
Το παρακάτω παράδειγμα δείχνει πώς μπορεί να γίνει αυτό.
Ας υποθέσουμε ότι έχουμε την ίδια συλλογή Υπαλλήλων που έχει τα ονόματα πεδίων "Employeeid" και "EmployeeName".
Ας υποθέσουμε επίσης ότι έχουμε τα ακόλουθα έγγραφα στη συλλογή μας.
Ταυτότητα Υπαλλήλου | όνομα υπαλλήλου |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Γκουράνγκ |
7 | GURU99 |
Τώρα, αν εκτελέσουμε το ίδιο ερώτημα όπως στο τελευταίο θέμα, δεν θα βλέπαμε ποτέ το έγγραφο με το "GURU99" στο αποτέλεσμα. Για να διασφαλίσουμε ότι αυτό εμφανίζεται στο σύνολο αποτελεσμάτων, πρέπει να προσθέσουμε την παράμετρο $options "I".
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Επεξήγηση κώδικα:
- Οι $options με την παράμετρο "I" (που σημαίνει έλλειψη ευαισθησίας πεζών-κεφαλαίων) προσδιορίζει ότι θέλουμε να πραγματοποιήσουμε την αναζήτηση ανεξάρτητα από το αν βρούμε τα γράμματα "Gu" με πεζά ή κεφαλαία γράμματα.
Εάν η εντολή εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη έξοδος:
Παραγωγή:
- Η έξοδος δείχνει ξεκάθαρα ότι παρόλο που ένα έγγραφο έχει το κεφαλαίο «Gu» , το έγγραφο εξακολουθεί να εμφανίζεται στο σύνολο αποτελεσμάτων.
Αντιστοίχιση μοτίβου χωρίς τον τελεστή regex
Κάποιος μπορεί επίσης να κάνει αντιστοίχιση μοτίβων χωρίς τον τελεστή regex. Το παρακάτω παράδειγμα δείχνει πώς μπορεί να γίνει αυτό.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Επεξήγηση κώδικα:
- Οι επιλογές "//" βασικά σημαίνει να καθορίσετε τα κριτήρια αναζήτησής σας μέσα σε αυτούς τους οριοθέτες. Ως εκ τούτου, προσδιορίζουμε το /Gu/ για να βρούμε ξανά εκείνα τα έγγραφα που έχουν 'Gu' στο EmployeeName τους.
Εάν η εντολή εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη έξοδος:
Παραγωγή:
Η έξοδος δείχνει ξεκάθαρα ότι επιστρέφονται εκείνα τα έγγραφα στα οποία το Όνομα Υπαλλήλου περιέχει τους χαρακτήρες «Gu».
Λήψη των τελευταίων «n» εγγράφων από μια συλλογή
Υπάρχουν διάφοροι τρόποι για να λάβετε τα τελευταία n έγγραφα σε μια συλλογή.
Ας δούμε έναν από τους τρόπους μέσω των παρακάτω βημάτων
Το παρακάτω παράδειγμα δείχνει πώς μπορεί να γίνει αυτό.
Ας υποθέσουμε ότι έχουμε την ίδια συλλογή Υπαλλήλων που έχει τα ονόματα πεδίων "Employeeid" και "EmployeeName".
Ας υποθέσουμε επίσης ότι έχουμε τα ακόλουθα έγγραφα στη συλλογή μας:
Ταυτότητα Υπαλλήλου | όνομα υπαλλήλου |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Γκουράνγκ |
7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Επεξήγηση κώδικα:
1) Όταν κάνετε ερώτημα για τα έγγραφα, χρησιμοποιήστε τη συνάρτηση ταξινόμησης για να ταξινομήσετε τις εγγραφές με αντίστροφη σειρά με βάση την τιμή του πεδίου _id στη συλλογή. Το -1 βασικά υποδεικνύει την ταξινόμηση των εγγράφων με αντίστροφη ή φθίνουσα σειρά, έτσι ώστε το τελευταίο έγγραφο να γίνει το πρώτο έγγραφο που εμφανίζεται.
2) Στη συνέχεια, χρησιμοποιήστε την ρήτρα ορίου για να εμφανίσετε απλώς τον αριθμό των εγγραφών που θέλετε. Εδώ έχουμε ορίσει την ρήτρα ορίου (2), οπότε θα φέρει τα δύο τελευταία έγγραφα.
Εάν η εντολή εκτελεστεί με επιτυχία, θα εμφανιστεί η ακόλουθη έξοδος:
Παραγωγή:
Η έξοδος δείχνει ξεκάθαρα ότι εμφανίζονται τα δύο τελευταία έγγραφα της συλλογής. Ως εκ τούτου, δείξαμε ξεκάθαρα ότι για να ανακτήσουμε τα τελευταία «n» έγγραφα στη συλλογή, μπορούμε πρώτα να ταξινομήσουμε τα έγγραφα με φθίνουσα σειρά και στη συνέχεια να χρησιμοποιήσουμε την ρήτρα ορίου για να επιστρέψουμε τον αριθμό «n» των εγγράφων που απαιτούνται.
Σημείωση: Εάν η αναζήτηση εκτελείται σε μια συμβολοσειρά που είναι μεγαλύτερη από 38,000 χαρακτήρες, δεν θα εμφανίσει τα σωστά αποτελέσματα.
Σύνοψη
- Η αντιστοίχιση μοτίβων μπορεί να επιτευχθεί από τον τελεστή $regex. Αυτός ο τελεστής μπορεί να χρησιμοποιηθεί για την εύρεση ορισμένων συμβολοσειρών στη συλλογή.
- Το σύμβολο ^ και $ μπορεί να χρησιμοποιηθεί για ακριβείς αναζητήσεις κειμένου με το ^ να χρησιμοποιείται για να βεβαιωθείτε ότι η συμβολοσειρά ξεκινά με έναν συγκεκριμένο χαρακτήρα και το $ χρησιμοποιείται για να διασφαλιστεί ότι η συμβολοσειρά τελειώνει με έναν συγκεκριμένο χαρακτήρα.
- Ο τελεστής 'i' μαζί με τον τελεστή $regex μπορούν να χρησιμοποιηθούν για να καθορίσουν την έλλειψη ευαισθησίας πεζών-κεφαλαίων, έτσι ώστε οι συμβολοσειρές να μπορούν να αναζητηθούν είτε είναι με πεζά είτε με κεφαλαία.
- Οι οριοθέτες // μπορούν επίσης να χρησιμοποιηθούν για αντιστοίχιση μοτίβων.
- Χρησιμοποιήστε έναν συνδυασμό ταξινόμησης και συνάρτησης ορίου για να επιστρέψετε τα τελευταία n έγγραφα στη συλλογή. Η συνάρτηση ταξινόμησης μπορεί να χρησιμοποιηθεί για την επιστροφή των εγγράφων με φθίνουσα σειρά, μετά την οποία η ρήτρα ορίου μπορεί να χρησιμοποιηθεί για τον περιορισμό του αριθμού των εγγράφων που επιστρέφονται.