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żenie regularne Operasłup: db.collection.find({field:{$regex:”pattern”}}) dopasowuje dokumenty zawierające wzorzec.
  • 🎯 Anchors: ^ i $ wymuszają dokładne dopasowania, wiążąc wzorzec z początkiem i końcem ciągu.
  • 🔠 Niewrażliwość na wielkość liter: Flaga $options 'i' dopasowuje tekst bez względu na wielkość liter.
  • Ograniczniki ukośnika: Owińping wzorzec w /…/ pasuje bez pisania operatora $regex.
  • 📉 Ostatnie N dokumentów: Połącz sort({_id:-1}) z limit(n), aby zwrócić najnowsze rekordy.
  • 🤖 Asystent AI: Asystenci tworzą wzorce wyrażeń regularnych i sygnalizują koszty wydajności pełnego skanowania kolekcji.

MongoDB Wyrażenie regularne (Regex)

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.

Używanie $regex OperaTor do dopasowywania wzorców

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

Code Wyjaśnienie:

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

Używanie $regex OperaTor do dopasowywania wzorców

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

Code Wyjaśnienie:

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

Dopasowanie wzorca za pomocą opcji $

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

Code Wyjaśnienie:

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

Dopasowanie wzorca za pomocą opcji $

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

Dopasowywanie wzorców bez wyrażenia regularnego OperaTor

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

Code Wyjaśnienie:

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

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ę 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

Pobieranie ostatnich n dokumentów z kolekcji

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

Code Wyjaśnienie:

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

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.

FAQ

Anchor wzór z ^ i $. Wzór „^Guru99$” pasuje tylko do „Guru99” i odrzuca „Guru999”, ponieważ ^ wiąże początek ciągu, a $ wiąże koniec.

Tylko wzorce z prefiksem ^ uwzględniające wielkość liter efektywnie wykorzystują indeks. Wzorce niezakotwiczone lub nieuwzględniające wielkości liter uruchamiają pełne skanowanie kolekcji, dlatego zakotwicz prefiks, kiedy tylko jest to możliwe.

Metaznaki, takie jak kropka, gwiazdka, plus lub nawias kwadratowy, należy poprzedzać ukośnikiem odwrotnym. Na przykład, wzorzec dla dosłownego zakończenia „.com” pomija kropkę, więc nie jest ona traktowana jako żaden znak.

$regex umożliwia elastyczne dopasowywanie wzorców w jednym polu i może przeskanować całą kolekcję. $text używa indeksu tekstowego do szybkiego wyszukiwania po słowach w indeksowanych polach, ale nie obsługuje wzorców częściowych podciągów.

Tak. Jeśli szukany ciąg znaków przekracza około 38 000 znaków, zapytanie może nie zwrócić poprawnych wyników. Aby zapewnić wiarygodne dopasowanie, wzorce i pola docelowe powinny mieścić się w tym limicie.

Przechowuj kopię pola zapisaną małymi literami w przypadku wyszukiwań nieuwzględniających wielkości liter, wzorce zakotwiczeń za pomocą ^ i preferuj indeks tekstowy lub wyszukiwanie w Atlasie w przypadku dużych kolekcji zamiast niezakotwiczonego $regex.

Asystenci AI przekształcają reguły prostego języka angielskiego we wzorce $regex, dodają prawidłowe punkty zaczepienia i flagę $options oraz ostrzegają, gdy zapytanie spowoduje powolne skanowanie całej kolekcji.

Tak. Copilot AI przepisuje niezakotwiczone wzorce, rekomenduje indeks tekstowy lub wyszukiwanie w Atlasie i konwertuje $regex bez uwzględniania wielkości liter na wyszukiwanie z małymi literami, co zwiększa szybkość.

Podsumuj ten post następująco: