Regularni izrazi se uporabljajo za ujemanje vzorcev, kar je v bistvu za nize ugotovitev v dokumentih.
Včasih pri pridobivanju dokumentov v zbirki morda ne boste natančno vedeli, kakšno natančno vrednost polja želite iskati. Zato lahko uporabimo regularne izraze za pomoč pri pridobivanju podatkov na podlagi vzorcev, ki ustrezajo iskalnim vrednostim.
V tej vadnici boste izvedeli -
- Uporaba operatorja $ regex za ujemanje vzorcev
- Vzorec se ujema z $ možnostmi
- Ujemanje vzorcev brez operaterja regularnih izrazov
- Pridobivanje zadnjih 'n' dokumentov iz zbirke
Uporaba operatorja $ regex za ujemanje vzorcev
Operator regularnega izraza v MongoDB se uporablja za iskanje določenih nizov v zbirki. Naslednji primer prikazuje, kako je to mogoče storiti.
Predpostavimo, da imamo isto zbirko zaposlenih, ki ima imeni polji "Employeeid" in "EmployeeName". Predpostavimo tudi, da imamo v svoji zbirki naslednje dokumente.
ID zaposlenega | ime zaposlenega |
22. | NewMartin |
2. | Mohan |
3. | Joe |
4. | MohanR |
100 | Guru99 |
6. | Gurang |
Tu v spodnji kodi smo za določanje iskalnih kriterijev uporabili operater regex.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Razlaga kode:
- Tu želimo najti vsa imena zaposlenih, ki vsebujejo znake 'Gu'. Zato določimo operator $ regex za določitev iskalnih meril za 'Gu'
- Printjson se uporablja za boljši tisk vsakega dokumenta, ki ga poizvedba vrne.
Če se ukaz uspešno izvede, se prikaže naslednji izhod:
Izhod:
Rezultat jasno kaže, da se vrnejo tisti dokumenti, v katerih ime zaposlenega vsebuje znake 'Gu'.
Če domnevate, da ima vaša zbirka naslednje dokumente z dodatnim dokumentom, ki je vseboval ime zaposlenega kot "Guru999". Če ste iskalna merila vnesli kot "Guru99", bo vrnil tudi dokument z "Guru999". A predpostavimo, da če tega nismo želeli in smo dokument želeli vrniti samo z "Guru99". Potem lahko to storimo z natančnim ujemanjem vzorcev. Za natančno ujemanje vzorcev bomo uporabili znaka in $. Na začetku niza bomo dodali znak in na koncu niza $.
ID zaposlenega | ime zaposlenega |
22. | NewMartin |
2. | Mohan |
3. | Joe |
4. | MohanR |
100 | Guru99 |
6. | Gurang |
8. | Guru999 |
Naslednji primer prikazuje, kako je to mogoče storiti.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Razlaga kode:
- Tukaj v iskalnih kriterijih uporabljamo znak in $. Se uporablja za zagotovitev, da se niz začne z določenim znakom, $ pa za zagotovitev, da se niz konča z določenim znakom. Torej, ko se koda izvede, bo prinesla samo niz z imenom "Guru99".
- Printjson se uporablja za boljši tisk vsakega dokumenta, ki ga poizvedba vrne.
Če se ukaz uspešno izvede, se prikaže naslednji izhod:
Izhod:
V izhodu je jasno vidno, da je pridobljen niz "Guru99".
Vzorec se ujema z $ možnostmi
Pri uporabi operaterja regularnih izrazov lahko z uporabo ključne besede $ options zagotovite tudi dodatne možnosti . Recimo, da ste na primer želeli najti vse dokumente, ki so imeli v imenu zaposlenega »Gu«, ne glede na to, ali je velika ali majhna. Če želimo takšen rezultat, moramo uporabiti možnosti $ s parametrom neobčutljivosti.
Naslednji primer prikazuje, kako je to mogoče storiti.
Predpostavimo, da imamo isto zbirko zaposlenih, ki ima imeni polji "Employeeid" in "EmployeeName".
Predpostavimo tudi, da imamo v svoji zbirki naslednje dokumente.
ID zaposlenega | ime zaposlenega |
22. | NewMartin |
2. | Mohan |
3. | Joe |
4. | MohanR |
100 | Guru99 |
6. | Gurang |
7. | GURU99 |
Zdaj, če zaženemo isto poizvedbo kot v zadnji temi, v rezultatu ne bomo nikoli videli dokumenta z "GURU99". Da bi zagotovili, da je to v naboru rezultatov, moramo dodati parameter $ options "I".
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Razlaga kode:
- Možnost $ s parametrom 'I' (kar pomeni neobčutljivost na velike in male črke) določa, da želimo izvesti iskanje, ne glede na to, ali najdemo črke 'Gu' z malimi ali velikimi črkami.
Če se ukaz uspešno izvede, se prikaže naslednji izhod:
Izhod:
- Izhod jasno kaže, da čeprav je en dokument z velikimi črkami 'Gu', se dokument še vedno prikaže v naboru rezultatov.
Ujemanje vzorcev brez operaterja regularnih izrazov
Ujemanje vzorcev je mogoče tudi brez operaterja regularnih izrazov. Naslednji primer prikazuje, kako je to mogoče storiti.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Razlaga kode:
- Možnosti "//" v bistvu pomenijo določitev iskalnih kriterijev znotraj teh ločil. Zato določimo / Gu /, da znova najdemo tiste dokumente, ki imajo v imenu EmployeeName "Gu".
Če se ukaz uspešno izvede, se prikaže naslednji izhod:
Izhod:
Rezultat jasno kaže, da se vrnejo tisti dokumenti, v katerih ime zaposlenega vsebuje znake 'Gu'.
Pridobivanje zadnjih 'n' dokumentov iz zbirke
Obstaja več načinov, kako dobiti zadnjih n dokumentov v zbirki.
Oglejmo si enega od načinov v naslednjih korakih
Naslednji primer prikazuje, kako je to mogoče storiti.
Predpostavimo, da imamo isto zbirko zaposlenih, ki ima imeni polji "Employeeid" in "EmployeeName".
Predpostavimo tudi, da imamo v svoji zbirki naslednje dokumente:
ID zaposlenega | ime zaposlenega |
22. | NewMartin |
2. | Mohan |
3. | Joe |
4. | MohanR |
100 | Guru99 |
6. | Gurang |
7. | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Razlaga kode:
1) Pri poizvedovanju po dokumentih uporabite funkcijo razvrščanja, da razvrstite zapise v obratnem vrstnem redu glede na vrednost polja _id v zbirki. -1 v bistvu označuje razvrščanje dokumentov v obratnem ali padajočem vrstnem redu, tako da zadnji dokument postane prvi dokument, ki se prikaže.
2) Nato uporabite klavzulo limit, da samo prikažete želeno število zapisov. Tu smo nastavili klavzulo o omejitvi (2), zato bo prišla zadnja dva dokumenta.
Če se ukaz uspešno izvede, se prikaže naslednji izhod:
Izhod:
Rezultat jasno kaže, da sta prikazana zadnja dva dokumenta v zbirki. Zato smo jasno pokazali, da lahko za pridobitev zadnjih 'n' dokumentov v zbirki dokumente najprej razvrstimo po padajočem vrstnem redu in nato s klavzulo o omejitvi vrnemo 'n' število potrebnih dokumentov.
Opomba : Če iskanje poteka v nizu, ki je daljši od recimo 38.000 znakov, ne bo prikazal pravih rezultatov.
Povzetek:
- Ujemanje vzorcev lahko doseže operater $ regex. S tem operatorjem lahko poiščemo določene nize v zbirki.
- Simbol in $ lahko uporabite za natančna iskanja besedila, pri čemer se uporablja za zagotovitev, da se niz začne z določenim znakom, $ pa za zagotovitev, da se niz konča z določenim znakom.
- Znak 'i' skupaj z operaterjem $ regex lahko uporabimo za določanje neobčutljivosti na velike in male črke, tako da je mogoče po nizih iskati, ali so v malih ali velikih črkah.
- Ločila // se lahko uporabljajo tudi za ujemanje vzorcev.
- Za vrnitev zadnjih n dokumentov v zbirki uporabite kombinacijo funkcije razvrščanja in omejitve. Funkcijo razvrščanja lahko uporabite za vrnitev dokumentov v padajočem vrstnem redu, po kateri lahko omejitveno klavzulo omejite število vrnjenih dokumentov.