Regulárne výrazy sa používajú na porovnávanie vzorov, čo je v podstate pre reťazce nálezov v dokumentoch.
Niekedy pri načítaní dokumentov v zbierke nemusíte vedieť, akú presnú hodnotu poľa hľadať. Preto je možné použiť regulárne výrazy na pomoc pri načítaní údajov na základe vyhľadávacích hodnôt zodpovedajúcich vzorom.
V tomto výučbe sa dozviete -
- Na porovnávanie vzorov sa používa operátor $ regex
- Zhoda vzoru s možnosťami $
- Zhoda vzorov bez operátora regulárneho výrazu
- Načítava sa posledných 'n' dokumentov zo zbierky
Na porovnávanie vzorov sa používa operátor $ regex
Operátor regulárneho výrazu v MongoDB sa používa na vyhľadávanie konkrétnych reťazcov v zbierke. Nasledujúci príklad ukazuje, ako sa to dá urobiť.
Predpokladajme, že máme rovnakú kolekciu zamestnancov, ktorá má názvy polí „Employeeid“ a „EmployeeName“. Predpokladajme tiež, že vo svojej zbierke máme nasledujúce dokumenty.
Zamestnanecké ID | Meno zamestnanca |
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
Tu v nižšie uvedenom kóde sme na určenie kritérií vyhľadávania použili operátor regulárneho výrazu.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Vysvetlenie kódu:
- Tu chceme nájsť všetky mená zamestnancov, ktoré majú znaky „Gu“. Preto zadáme operátor $ regex na definovanie kritérií vyhľadávania výrazu „Gu“
- Printjson sa používa na lepšiu tlač každého dokumentu, ktorý je vrátený dotazom.
Ak je príkaz vykonaný úspešne, zobrazí sa nasledujúci výstup:
Výkon:
Výstup jasne ukazuje, že sa vrátia tie dokumenty, v ktorých meno zamestnanca obsahuje znaky „Gu“.
Predpokladajme, že vaša zbierka obsahuje nasledujúce dokumenty s ďalším dokumentom, ktorý obsahoval meno zamestnanca ako „Guru999“. Ak ste zadali kritériá vyhľadávania ako „Guru99“, vráti sa vám aj dokument, ktorý mal „Guru999“. Ale predpokladajme, že keby sme to nechceli a chceli by sme vrátiť dokument iba s „Guru99“. Potom to môžeme urobiť pomocou presnej zhody vzorov. Na presné porovnanie vzorov použijeme znaky a $. Pridáme znak na začiatok reťazca a $ na koniec reťazca.
Zamestnanecké ID | Meno zamestnanca |
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
8 | Guru999 |
Nasledujúci príklad ukazuje, ako sa to dá urobiť.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Vysvetlenie kódu:
- Tu v kritériách vyhľadávania používame znaky a $. Znak sa používa na zabezpečenie toho, aby sa reťazec začínal určitým znakom, a znak $ sa používa na zabezpečenie toho, aby sa reťazec končil určitým znakom. Takže keď sa kód spustí, načíta iba reťazec s názvom „Guru99“.
- Printjson sa používa na lepšiu tlač každého dokumentu, ktorý je vrátený dotazom.
Ak je príkaz vykonaný úspešne, zobrazí sa nasledujúci výstup:
Výkon:
Na výstupe je jasne viditeľné, že sa načítal reťazec „Guru99“.
Zhoda vzoru s možnosťami $
Pri použití operátora regulárneho výrazu je možné poskytnúť ďalšie možnosti pomocou kľúčového slova $ options . Predpokladajme napríklad, že ste chceli nájsť všetky dokumenty, ktoré mali v mene zamestnanca znak „Gu“, bez ohľadu na to, či sa v ňom rozlišujú veľké a malé písmená. Ak je taký výsledok požadovaný, potom musíme použiť možnosti $ s parametrom necitlivosti na malé a veľké písmená.
Nasledujúci príklad ukazuje, ako sa to dá urobiť.
Predpokladajme, že máme rovnakú kolekciu zamestnancov, ktorá má názvy polí „Employeeid“ a „EmployeeName“.
Predpokladajme tiež, že vo svojej zbierke máme nasledujúce dokumenty.
Zamestnanecké ID | Meno zamestnanca |
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | 99 GURU |
Ak teraz spustíme rovnaký dopyt ako v poslednej téme, nikdy by sme vo výsledku neuvideli dokument, ktorý by mal „GURU99“. Aby sme zaistili, že sa to dostane do množiny výsledkov, musíme pridať parameter $ options „I“.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Vysvetlenie kódu:
- Možnosti $ s parametrom „I“ (čo znamená necitlivosť na veľké a malé písmená) špecifikujú, že chceme vykonať vyhľadávanie bez ohľadu na to, či nájdeme písmená „Gu“ malé alebo veľké.
Ak je príkaz vykonaný úspešne, zobrazí sa nasledujúci výstup:
Výkon:
- Výstup jasne ukazuje, že aj keď má jeden dokument veľké písmeno „Gu“, dokument sa stále zobrazí v množine výsledkov.
Zhoda vzorov bez operátora regulárneho výrazu
Dá sa tiež urobiť zhoda vzorov bez operátora regulárneho výrazu. Nasledujúci príklad ukazuje, ako sa to dá urobiť.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Vysvetlenie kódu:
- Možnosti „//“ v podstate znamenajú špecifikovať kritériá vyhľadávania v rámci týchto oddeľovačov. Preto zadávame / Gu /, aby sme znova našli tie dokumenty, ktoré majú v názve EmployeeName „Gu“.
Ak je príkaz vykonaný úspešne, zobrazí sa nasledujúci výstup:
Výkon:
Výstup jasne ukazuje, že sa vrátia tie dokumenty, v ktorých meno zamestnanca obsahuje znaky „Gu“.
Načítava sa posledných 'n' dokumentov zo zbierky
Existuje niekoľko spôsobov, ako získať posledných n dokumentov v zbierke.
Pozrime sa na jeden zo spôsobov prostredníctvom nasledujúcich krokov
Nasledujúci príklad ukazuje, ako sa to dá urobiť.
Predpokladajme, že máme rovnakú kolekciu zamestnancov, ktorá má názvy polí „Employeeid“ a „EmployeeName“.
Predpokladajme tiež, že v našej zbierke máme nasledujúce dokumenty:
Zamestnanecké ID | Meno zamestnanca |
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)
Vysvetlenie kódu:
1) Pri vyhľadávaní dokumentov použite funkciu zoradenia na zoradenie záznamov v opačnom poradí na základe hodnoty poľa _id v zbierke. -1 v zásade označuje triedenie dokumentov v opačnom poradí alebo v zostupnom poradí, takže posledný dokument sa stane prvým dokumentom, ktorý sa zobrazí.
2) Potom pomocou doložky o limite iba zobrazte požadovaný počet záznamov. Tu sme nastavili limitnú klauzulu (2), takže sa načítajú posledné dva dokumenty.
Ak je príkaz vykonaný úspešne, zobrazí sa nasledujúci výstup:
Výkon:
Výstup jasne ukazuje, že sú zobrazené posledné dva dokumenty v zbierke. Preto sme jasne ukázali, že na získanie posledných 'n' dokumentov v zbierke môžeme najskôr dokumenty zoradiť zostupne a potom pomocou klauzuly limit vrátiť požadovaný počet dokumentov 'n'.
Poznámka : Ak sa vyhľadávanie vykonáva na reťazci, ktorý má viac ako povedzme 38 000 znakov, nezobrazia sa správne výsledky.
Zhrnutie:
- Priraďovanie vzorov môže dosiahnuť operátor $ regex. Tento operátor možno použiť na vyhľadanie určitých reťazcov v zbierke.
- Symbol a $ je možné použiť na presné textové vyhľadávanie, pričom sa používa na zaistenie toho, aby sa reťazec začínal určitým znakom a $ sa používa na zabezpečenie toho, aby sa reťazec končil určitým znakom.
- Písmeno „i“ spolu s operátorom $ regex možno použiť na určenie necitlivosti písmen, aby bolo možné prehľadávať reťazce, či sú malé alebo veľké.
- Oddeľovače // možno použiť aj na porovnávanie vzorov.
- Na vrátenie posledných n dokumentov v zbierke použite kombináciu funkcií zoradenia a obmedzenia. Funkciu triedenia je možné použiť na vrátenie dokumentov v zostupnom poradí, potom je možné pomocou limitnej doložky obmedziť počet vrátených dokumentov.