MongoDB Wyrażenie regularne (Regex) z przykładami
Wyrażenia regularne służą do dopasowywania wzorców, czyli w zasadzie do ciągów wynikó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
Kurs operator wyrażenia regularnego 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ę Employee, która ma nazwy pól „Employeeid” i „EmployeeName”. Załóżmy również, że mamy następujące dokumenty w naszej kolekcji.
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)
Wyjaśnienie kodu:
- Tutaj chcemy znaleźć wszystkie nazwiska pracowników, które zawierają znaki „Gu”. Dlatego określamy operator $regex, aby zdefiniować kryteria wyszukiwania „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 Twoja kolekcja ma następujące dokumenty z dodatkowym dokumentem, który zawierał Nazwę Pracownika jako „Guru999”. Jeśli wprowadzisz kryteria wyszukiwania jako „Guru99”, zwróci również dokument, który zawierał „Guru999”. Ale załóżmy, że nie chcemy tego i chcemy zwrócić tylko dokument z „Guru99”. Wtedy możemy to zrobić za pomocą dokładnego dopasowania wzorca. Aby wykonać dokładne dopasowanie wzorca, użyjemy znaku ^ i $. Dodamy znak ^ na początku ciągu i $ na końcu ciągu.
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)
Wyjaśnienie kodu:
- 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 $ służy do zapewnienia, że ciąg kończy się określonym znakiem. Zatem po wykonaniu kodu pobrany zostanie 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 pobrany został ciąg „Guru99”.
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ę pracowników, która ma 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 |
7 | GURU99 |
Jeśli teraz wykonamy to samo zapytanie, co w poprzednim temacie, nigdy nie zobaczymy w rezultacie dokumentu z „GURU99”. Aby mieć pewność, że znajdzie się to w zestawie wyników, musimy dodać parametr „I” $options.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Wyjaśnienie kodu:
- Opcja $options z parametrem 'I' (co oznacza nieuwzględnianie wielkości liter) określa, że chcemy przeprowadzić wyszukiwanie niezależnie od tego, czy znajdziemy litery 'Gu' pisane małymi czy dużymi literami.
Jeśli polecenie zostanie wykonane pomyślnie, wyświetlony zostanie następujący komunikat:
Wyjście:
- Dane wyjściowe wyraźnie pokazują, że nawet jeśli w nazwie jednego dokumentu znajduje się wielka litera „Gu”, dokument ten nadal jest wyświetlany w zestawie wyników.
Dopasowywanie wzorców bez operatora regex
Można również wykonać dopasowanie wzorca bez operatora regex. Poniższy przykład pokazuje, jak to zrobić.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Wyjaśnienie kodu:
- Opcje „//” zasadniczo oznaczają określenie kryteriów wyszukiwania w obrębie tych ograniczników. Dlatego też określamy /Gu/, aby ponownie znaleźć te dokumenty, które mają „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ę pracowników, która ma 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 |
7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Wyjaśnienie kodu:
1) Podczas wyszukiwania dokumentów użyj funkcji sort, aby posortować rekordy w odwrotnej kolejności na podstawie wartości pola _id w kolekcji. -1 zasadniczo wskazuje, aby posortować dokumenty w odwrotnej kolejności lub w kolejności malejącej, tak aby ostatni dokument stał się pierwszym wyświetlanym dokumentem.
2) Następnie użyj klauzuli limit, aby wyświetlić żądaną liczbę rekordów. Tutaj ustawiliśmy klauzulę limitu (2), więc pobierze dwa ostatnie 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.
Podsumowanie
- Dopasowanie wzorca można osiągnąć za pomocą operatora $regex. Tego operatora można użyć do znalezienia określonych ciągów w kolekcji.
- Symboli ^ i $ można używać do wyszukiwania dokładnego tekstu, przy czym ^ służy do upewnienia się, że ciąg zaczyna się od określonego znaku, a $ służy do zapewnienia, że ciąg kończy się określonym znakiem.
- Operator „i” wraz z $regex umożliwia określenie braku rozróżniania wielkości liter, dzięki czemu możliwe będzie przeszukiwanie ciągów znaków niezależnie od tego, czy zawierają małe, czy wielkie litery.
- Separatory // mogą być również używane do dopasowywania wzorców.
- Użyj kombinacji sortowania i funkcji limitu, aby zwrócić n ostatnich dokumentów w kolekcji. Za pomocą funkcji sortowania można zwrócić dokumenty w kolejności malejącej, po czym można zastosować klauzulę limit w celu ograniczenia liczby zwracanych dokumentów.