Regulární výraz MongoDB (Regex) s příklady

Obsah:

Anonim

Regulární výrazy se používají pro porovnávání vzorů, což je v zásadě pro řetězce zjištění v dokumentech.

Někdy při načítání dokumentů ve sbírce možná nebudete přesně vědět, jakou přesnou hodnotu pole hledat. Proto je možné pomocí regulárních výrazů pomáhat při načítání dat na základě vyhledávacích hodnot odpovídajících vzorům.

V tomto výukovém programu se naučíte -

  • Použití operátoru $ regex pro porovnávání vzorů
  • Porovnávání vzorů s možnostmi $
  • Porovnávání vzorů bez operátoru regulárního výrazu
  • Načítání posledních 'n' dokumentů ze sbírky

Použití operátoru $ regex pro porovnávání vzorů

Operátor regex v MongoDB se používá k hledání konkrétních řetězců v kolekci. Následující příklad ukazuje, jak toho lze dosáhnout.

Předpokládejme, že máme stejnou kolekci zaměstnanců, která má názvy polí „Employeeid“ a „EmployeeName“. Předpokládejme také, že máme v naší sbírce následující dokumenty.

ID zaměstnance jméno zaměstnance
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

Zde v níže uvedeném kódu jsme použili operátor regulárního výrazu k určení kritérií vyhledávání.

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

Vysvětlení kódu:

  1. Zde chceme najít všechna jména zaměstnanců, která mají znaky „Gu“. Proto zadáme operátor $ regex, který definuje vyhledávací kritéria 'Gu'
  2. Printjson se používá k lepšímu tisku každého dokumentu, který je vrácen dotazem.

Pokud je příkaz úspěšně proveden, zobrazí se následující výstup:

Výstup:

Výstup jasně ukazuje, že jsou vráceny ty dokumenty, ve kterých jméno zaměstnance obsahuje znaky „Gu“.

Předpokládejme, že vaše sbírka obsahuje následující dokumenty s dalším dokumentem, který obsahoval jméno zaměstnance jako „Guru999“. Pokud jste zadali kritéria hledání jako „Guru99“, vrátilo by to také dokument, který měl „Guru999“. Ale předpokládejme, že pokud bychom to nechtěli a chtěli jsme dokument vrátit pouze s „Guru99“. Pak to můžeme udělat s přesnou shodou vzorů. Abychom dosáhli přesného porovnávání vzorů, použijeme znak a $. Přidáme znak na začátek řetězce a $ na konec řetězce.

ID zaměstnance jméno zaměstnance
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

Následující příklad ukazuje, jak toho lze dosáhnout.

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

Vysvětlení kódu:

  1. Zde v kritériích vyhledávání používáme znak a $. Se používá k zajištění toho, aby řetězec začínal určitým znakem, a $ se používá k zajištění toho, aby řetězec skončil určitým znakem. Když se kód spustí, načte pouze řetězec s názvem „Guru99“.
  2. Printjson se používá k lepšímu tisku každého dokumentu, který je vrácen dotazem.

Pokud je příkaz úspěšně proveden, zobrazí se následující výstup:

Výstup:

Na výstupu je jasně vidět, že se načte řetězec „Guru99“.

Porovnávání vzorů s možnostmi $

Při použití operátoru regex lze také poskytnout další možnosti pomocí klíčového slova $ options . Předpokládejme například, že jste chtěli najít všechny dokumenty, které ve svém jménu zaměstnance obsahovaly znak „Gu“, bez ohledu na to, zda se v něm rozlišují velká a malá písmena. Pokud je takový výsledek požadován, musíme použít možnosti $ s parametrem necitlivosti písmen.

Následující příklad ukazuje, jak toho lze dosáhnout.

Předpokládejme, že máme stejnou kolekci zaměstnanců, která má názvy polí „Employeeid“ a „EmployeeName“.

Předpokládejme také, že máme v naší sbírce následující dokumenty.

ID zaměstnance jméno zaměstnance
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 99 GURU

Nyní, když spustíme stejný dotaz jako v posledním tématu, nikdy bychom neuviděli dokument s výsledkem „GURU99“. Abychom zajistili, že to přijde v sadě výsledků, musíme přidat parametr $ options „I“.

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

Vysvětlení kódu:

  1. Možnosti $ s parametrem „I“ (což znamená necitlivost na velká a malá písmena) specifikují, že chceme provést vyhledávání bez ohledu na to, zda najdeme písmena „Gu“ malými nebo velkými písmeny.

Pokud je příkaz úspěšně proveden, zobrazí se následující výstup:

Výstup:

  1. Výstup jasně ukazuje, že i když má jeden dokument velká písmena „Gu“, dokument se stále zobrazí v sadě výsledků.

Porovnávání vzorů bez operátoru regulárního výrazu

Lze také provést porovnávání vzorů bez operátoru regulárního výrazu. Následující příklad ukazuje, jak toho lze dosáhnout.

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

Vysvětlení kódu:

  1. Možnosti „//“ v zásadě znamenají určit vyhledávací kritéria v rámci těchto oddělovačů. Proto zadáváme / Gu /, abychom znovu našli ty dokumenty, které mají ve svém EmployeeName znak „Gu“.

Pokud je příkaz úspěšně proveden, zobrazí se následující výstup:

Výstup:

Výstup jasně ukazuje, že jsou vráceny ty dokumenty, ve kterých jméno zaměstnance obsahuje znaky „Gu“.

Načítání posledních 'n' dokumentů ze sbírky

Existuje několik způsobů, jak získat posledních n dokumentů do sbírky.

Podívejme se na jeden ze způsobů pomocí následujících kroků

Následující příklad ukazuje, jak toho lze dosáhnout.

Předpokládejme, že máme stejnou kolekci zaměstnanců, která má názvy polí „Employeeid“ a „EmployeeName“.

Předpokládejme také, že máme v naší sbírce následující dokumenty:

ID zaměstnance jméno zaměstnance
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 99 GURU
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Vysvětlení kódu:

1) Při dotazování na dokumenty použijte funkci řazení k seřazení záznamů v obráceném pořadí na základě hodnoty pole _id v kolekci. -1 v zásadě označuje řazení dokumentů v obráceném nebo sestupném pořadí tak, aby se poslední dokument stal prvním zobrazeným dokumentem.

2) Potom použijte klauzuli limitu pouze k zobrazení požadovaného počtu záznamů. Zde jsme nastavili mezní klauzuli (2), takže načte poslední dva dokumenty.

Pokud je příkaz úspěšně proveden, zobrazí se následující výstup:

Výstup:

Výstup jasně ukazuje, že jsou zobrazeny poslední dva dokumenty ve sbírce. Proto jsme jasně ukázali, že k načtení posledních 'n' dokumentů ve sbírce můžeme nejprve seřadit dokumenty v sestupném pořadí a poté použít klauzuli limit k vrácení požadovaného počtu 'n' dokumentů.

Poznámka : Pokud je vyhledávání prováděno na řetězci, který je větší než řekněme 38 000 znaků, nezobrazí se správné výsledky.

Souhrn:

  • Porovnávání vzorů lze dosáhnout operátorem $ regex. Tento operátor lze použít k vyhledání určitých řetězců v kolekci.
  • Symbol a $ lze použít pro přesná textová vyhledávání, přičemž se používá k zajištění toho, aby řetězec začínal určitým znakem a $ slouží k zajištění toho, aby řetězec skončil určitým znakem.
  • Písmeno „i“ spolu s operátorem $ regex lze použít k určení necitlivosti na velká a malá písmena, aby bylo možné prohledávat řetězce, ať už jsou malá nebo velká.
  • Oddělovače // lze také použít pro porovnávání vzorů.
  • Pomocí kombinace řazení a funkce limitu vrátíte posledních n dokumentů v kolekci. Funkci třídění lze použít k vrácení dokumentů v sestupném pořadí, po kterém lze pomocí limitní klauzule omezit počet vrácených dokumentů.