MongoDB Wyrażenie regularne ($regex) z przykładami
⚡ Inteligentne podsumowanie
MongoDB Wyrażenia regularne wykonują dopasowywanie wzorców w celu znalezienia ciągów znaków w dokumentach, używając operatora $regex, flagi $options oznaczającej ignorowanie wielkości liter, kotwic w przypadku dokładnych dopasowań i ukośników, gdy dokładna wartość pola jest nieznana.

Wyrażenia regularne służą do dopasowywania wzorców, co zasadniczo polega na znajdowaniu ciągów znaków w dokumentach.
Czasami podczas wyszukiwania dokumentów w kolekcji możesz nie wiedzieć dokładnie, jaką dokładną wartość pola należy wyszukać. Dlatego można używać wyrażeń regularnych, aby pomóc w wyszukiwaniu danych na podstawie wartości wyszukiwania odpowiadających wzorcom.
Używanie operatora $regex do dopasowywania wzorców
Operator $regex w MongoDB służy do wyszukiwania określonych ciągów w kolekcji. Poniższy przykład pokazuje, jak to zrobić.
Załóżmy, że mamy tę samą kolekcję „Pracownicy”, która zawiera nazwy pól „Employeeid” i „EmployeeName”. Załóżmy również, że w naszej kolekcji znajdują się następujące dokumenty.
| Dowód pracownika | imię i nazwisko pracownika |
|---|---|
| 22 | NowyMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | Mohan R |
| 100 | Guru99 |
| 6 | Stary |
W poniższym kodzie użyliśmy operatora $regex do określenia kryteriów wyszukiwania.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Wyjaśnienie:
- Tutaj chcemy znaleźć wszystkie nazwiska pracowników zawierające znaki „Gu”. Dlatego określamy operator $regex, aby zdefiniować kryteria wyszukiwania dla „Gu”.
- Printjson służy do lepszego drukowania każdego dokumentu zwracanego przez zapytanie.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
Dane wyjściowe wyraźnie pokazują, że zwracane są te dokumenty, w których nazwisko pracownika zawiera znaki „Gu”.
Załóżmy, że w Twojej kolekcji znajdują się następujące dokumenty wraz z dodatkowym dokumentem, który zawierał imię i nazwisko pracownika jako „Guru999”. Jeśli wpisałeś kryteria wyszukiwania jako „Guru99”, zwróci również dokument, który miał „Guru999”. Załóżmy jednak, że nie chcemy tego i chcemy jedynie zwrócić dokument z „Guru99”. Następnie możemy to zrobić z dokładnym dopasowaniem wzorca. Aby wykonać dokładne dopasowanie wzorca, użyjemy znaków ^ i $. Dodamy znak ^ na początku ciągu i znak $ na jego końcu.
| Dowód pracownika | imię i nazwisko pracownika |
|---|---|
| 22 | NowyMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | Mohan R |
| 100 | Guru99 |
| 6 | Stary |
| 8 | Guru999 |
Poniższy przykład pokazuje, jak to zrobić.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code Wyjaśnienie:
- Tutaj w kryteriach wyszukiwania używamy znaków ^ i $. Znak ^ służy do upewnienia się, że ciąg zaczyna się od określonego znaku, a znak $ do upewnienia się, że ciąg kończy się określonym znakiem. Dlatego po uruchomieniu kodu zostanie pobrany tylko ciąg o nazwie „Guru99 ”.
- Printjson służy do lepszego drukowania każdego dokumentu zwracanego przez zapytanie.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
Na wyjściu wyraźnie widać, że ciąg „Guru99” jest pobrane.
Dopasowanie wzorca za pomocą opcji $
Używając operatora $regex można również podać dodatkowe opcje, używając Opcje $ słowo kluczowe. Załóżmy na przykład, że chcesz znaleźć wszystkie dokumenty, które mają „Gu” w nazwisku pracownika, niezależnie od tego, czy uwzględniana jest wielkość liter, czy nie. Jeśli taki wynik jest pożądany, musimy użyć Opcje $ z parametrem niewrażliwości na wielkość liter.
Poniższy przykład pokazuje, jak to zrobić.
Załóżmy, że mamy tę samą kolekcję Employee, której nazwy pól to „Employeeid” i „EmployeeName”.
Załóżmy również, że w naszych zbiorach znajdują się następujące dokumenty.
| Dowód pracownika | imię i nazwisko pracownika |
|---|---|
| 22 | NowyMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | Mohan R |
| 100 | Guru99 |
| 6 | Stary |
| 7 | GURU99 |
Jeśli uruchomimy to samo zapytanie, co w poprzednim temacie, nigdy nie zobaczymy dokumentu z „GURU99” w wynikach. Aby mieć pewność, że pojawi się on w zestawie wyników, musimy dodać parametr „i” do $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Wyjaśnienie:
- Opcja $options z parametrem „i” (oznaczającym brak rozróżniania wielkości liter) określa, że chcemy przeprowadzić wyszukiwanie niezależnie od tego, czy znajdziemy litery „Gu” małe czy wielkie.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
- Dane wyjściowe wyraźnie pokazują, że mimo iż w nazwie jednego dokumentu występuje wielka litera „Gu”, dokument ten nadal jest wyświetlany w zestawie wyników.
Dopasowywanie wzorców bez operatora regex
Można również zastosować dopasowanie wzorca bez operatora $regex. Poniższy przykład pokazuje, jak to zrobić.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code Wyjaśnienie:
- Ograniczniki „//” zasadniczo służą do określenia kryteriów wyszukiwania w obrębie tych ograniczników. Dlatego podajemy /Gu/, aby ponownie znaleźć dokumenty zawierające „Gu” w nazwie pracownika.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
Dane wyjściowe wyraźnie pokazują, że zwracane są te dokumenty, w których nazwisko pracownika zawiera znaki „Gu”.
Pobieranie ostatnich n dokumentów z kolekcji
Istnieją różne sposoby uzyskania n ostatnich dokumentów w kolekcji.
Przyjrzyjmy się jednemu ze sposobów, wykonując następujące kroki.
Poniższy przykład pokazuje, jak to zrobić.
Załóżmy, że mamy tę samą kolekcję Employee, której nazwy pól to „Employeeid” i „EmployeeName”.
Załóżmy również, że w naszej kolekcji znajdują się następujące dokumenty:
| Dowód pracownika | imię i nazwisko pracownika |
|---|---|
| 22 | NowyMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | Mohan R |
| 100 | Guru99 |
| 6 | Stary |
| 7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code Wyjaśnienie:
- Podczas wyszukiwania dokumentów użyj funkcji sortowania, aby posortować rekordy w kolejności odwrotnej na podstawie wartości pola _id w kolekcji. Wartość -1 oznacza posortowanie dokumentów w kolejności odwrotnej lub malejącej, tak aby ostatni dokument był wyświetlany jako pierwszy.
- Następnie użyj klauzuli limit, aby wyświetlić tylko żądaną liczbę rekordów. Tutaj ustawiliśmy klauzulę limit (2), aby pobrać ostatnie dwa dokumenty.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
Dane wyjściowe wyraźnie pokazują, że wyświetlane są dwa ostatnie dokumenty w kolekcji. Dlatego wyraźnie pokazaliśmy, że aby pobrać ostatnie 'n' dokumentów w kolekcji, możemy najpierw posortować dokumenty w kolejności malejącej, a następnie użyć klauzuli limit, aby zwrócić liczbę 'n' dokumentów, które są wymagane.
Note: Jeśli wyszukiwanie zostanie przeprowadzone na ciągu znaków dłuższym niż powiedzmy 38,000 XNUMX znaków, nie zostaną wyświetlone prawidłowe wyniki.










