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.

Używanie $regex OperaTor do dopasowywania wzorców

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

Wyjaśnienie kodu:

  1. Tutaj chcemy znaleźć wszystkie nazwiska pracowników, które zawierają znaki „Gu”. Dlatego określamy operator $regex, aby zdefiniować kryteria wyszukiwania „Gu”
  2. 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:

Używanie $regex OperaTor do dopasowywania wzorców

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

Używanie $regex OperaTor do dopasowywania wzorców

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

Wyjaśnienie kodu:

  1. 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”.
  2. 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:

Używanie $regex OperaTor do dopasowywania wzorców

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.

Dopasowanie wzorca za pomocą opcji $

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

Wyjaśnienie kodu:

  1. 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:

Dopasowanie wzorca za pomocą opcji $

  1. 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ć.

Dopasowywanie wzorców bez wyrażenia regularnego OperaTor

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

Wyjaśnienie kodu:

  1. 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:

Dopasowywanie wzorców bez wyrażenia regularnego OperaTor

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

Pobieranie ostatnich n dokumentów z kolekcji

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:

Pobieranie ostatnich n dokumentów z kolekcji

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.