MongoDB Редовен израз (Regex) с примери
Регулярните изрази се използват за съвпадение на шаблони, което основно е за намиране на низове в документи.
Понякога, когато извличате документи в колекция, може да не знаете точно каква е точната стойност на полето, за да търсите. Следователно, можете да използвате регулярни изрази, за да подпомогнете извличането на данни въз основа на търсени стойности за съвпадение на шаблони.
Използване на оператор $regex за съвпадение на шаблони
- regex оператор в MongoDB се използва за търсене на конкретни низове в колекцията. Следващият пример показва как може да се направи това.
Да приемем, че имаме една и съща колекция Employee, която има имената на полетата „Employeeid“ и „EmployeeName“. Да предположим също, че имаме следните документи в нашата колекция.
ID на служител | Име на служителя |
---|---|
22 | Нов Мартин |
2 | Мохан |
3 | Джо |
4 | Мохан Р |
100 | Guru99 |
6 | Гуранг |
Тук в кода по-долу сме използвали оператор на регулярен израз, за да посочим критериите за търсене.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Обяснение на кода:
- Тук искаме да намерим всички имена на служители, които съдържат знаците „Gu“. Следователно ние указваме оператора $regex, за да дефинираме критериите за търсене на „Gu“
- Printjson се използва за отпечатване на всеки документ, върнат от заявката, по по-добър начин.
Ако командата е изпълнена успешно, ще се покаже следният изход:
Изход:
Резултатът ясно показва, че тези документи, в които името на служителя съдържа знаците „Gu“, се връщат.
Ако предположим, че вашата колекция има следните документи с допълнителен документ, който съдържа името на служителя като „Guru999“. Ако сте въвели критериите за търсене като „Guru99“, той също ще върне документа, който съдържа „Guru999“. Но да предположим, че не искахме това и искахме да върнем документа само с „Guru99“. След това можем да направим това с точно съвпадение на образец. За да направим точно съпоставяне на образец, ще използваме символите ^ и $. Ще добавим знака ^ в началото на низа и $ в края на низа.
ID на служител | Име на служителя |
---|---|
22 | Нов Мартин |
2 | Мохан |
3 | Джо |
4 | Мохан Р |
100 | Guru99 |
6 | Гуранг |
8 | Guru999 |
Следващият пример показва как може да се направи това.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Обяснение на кода:
- Тук в критериите за търсене използваме символите ^ и $. ^ се използва, за да се увери, че низът започва с определен знак, а $ се използва, за да се гарантира, че низът завършва с определен знак. Така че, когато кодът се изпълни, той ще извлече само низа с името „Guru99“.
- Printjson се използва за отпечатване на всеки документ, върнат от заявката, по по-добър начин.
Ако командата е изпълнена успешно, ще се покаже следният изход:
Изход:
В изхода ясно се вижда, че низът „Guru99“ е извлечен.
Съпоставяне на шаблони с $options
Когато използвате оператора regex, можете също да предоставите допълнителни опции, като използвате $опции ключова дума. Да предположим например, че искате да намерите всички документи, които имат „Gu“ в имената на служителите си, независимо дали са чувствителни или нечувствителни. Ако се желае такъв резултат, тогава трябва да използваме $опции с параметър за нечувствителност към малки и главни букви.
Следващият пример показва как може да се направи това.
Да приемем, че имаме една и съща колекция Employee, която има имената на полетата „Employeeid“ и „EmployeeName“.
Да предположим също, че имаме следните документи в нашата колекция.
ID на служител | Име на служителя |
---|---|
22 | Нов Мартин |
2 | Мохан |
3 | Джо |
4 | Мохан Р |
100 | Guru99 |
6 | Гуранг |
7 | ГУРУ99 |
Сега, ако изпълним същата заявка като в последната тема, никога няма да видим документа с „GURU99“ в резултата. За да гарантираме, че това идва в набора от резултати, трябва да добавим параметъра $options „I“.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Обяснение на кода:
- Параметърът $options с параметър 'I' (което означава нечувствителност към малки и малки букви) указва, че искаме да извършим търсенето без значение дали намираме буквите 'Gu' в малки или главни букви.
Ако командата е изпълнена успешно, ще се покаже следният изход:
Изход:
- Резултатът ясно показва, че въпреки че един документ има главни букви „Gu“, документът все още се показва в набора от резултати.
Съвпадение на образец без оператора regex
Човек може също да направи съвпадение на шаблони без оператора regex. Следващият пример показва как може да се направи това.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Обяснение на кода:
- Опциите „//“ основно означават да посочите вашите критерии за търсене в рамките на тези разделители. Следователно ние указваме /Gu/, за да намерим отново онези документи, които имат „Gu“ в EmployeeName.
Ако командата е изпълнена успешно, ще се покаже следният изход:
Изход:
Резултатът ясно показва, че тези документи, в които името на служителя съдържа знаците „Gu“, се връщат.
Извличане на последните 'n' документа от колекция
Има различни начини да получите последните n документа в колекция.
Нека разгледаме един от начините чрез следните стъпки
Следващият пример показва как може да се направи това.
Да приемем, че имаме една и съща колекция Employee, която има имената на полетата „Employeeid“ и „EmployeeName“.
Да предположим също, че имаме следните документи в нашата колекция:
ID на служител | Име на служителя |
---|---|
22 | Нов Мартин |
2 | Мохан |
3 | Джо |
4 | Мохан Р |
100 | Guru99 |
6 | Гуранг |
7 | ГУРУ99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Обяснение на кода:
1) Когато правите заявки за документите, използвайте функцията за сортиране, за да сортирате записите в обратен ред въз основа на стойността на полето _id в колекцията. -1 основно показва да сортирате документите в обратен ред или в низходящ ред, така че последният документ да стане първият документ, който ще бъде показан.
2) След това използвайте клаузата за ограничение, за да покажете само броя на записите, които искате. Тук сме задали клаузата за ограничение (2), така че тя ще извлече последните два документа.
Ако командата е изпълнена успешно, ще се покаже следният изход:
Изход:
Резултатът ясно показва, че са показани последните два документа в колекцията. Следователно ясно показахме, че за да извлечем последните 'n' документа в колекцията, можем първо да сортираме документите в низходящ ред и след това да използваме клаузата за ограничение, за да върнем 'n' броя документи, които са необходими.
Забележка: Ако търсенето се извърши на низ, който е по-голям от да кажем 38,000 XNUMX знака, то няма да покаже правилните резултати.
Oбобщение
- Съвпадението на образец може да се постигне чрез оператора $regex. Този оператор може да се използва за намиране на определени низове в колекцията.
- Символите ^ и $ могат да се използват за точно търсене на текст, като ^ се използва, за да се увери, че низът започва с определен знак, а $ се използва, за да се гарантира, че низът завършва с определен знак.
- „I“ заедно с оператора $regex може да се използва за определяне на нечувствителност към главни и малки букви, така че низовете да могат да се търсят, независимо дали са с малки или главни букви.
- Разделителите // могат да се използват и за съпоставяне на образец.
- Използвайте комбинация от сортиране и функция за ограничаване, за да върнете последните n документа в колекцията. Функцията за сортиране може да се използва за връщане на документите в низходящ ред, след което клаузата за ограничение може да се използва за ограничаване на броя на върнатите документи.