Условни оператори на MongoDB задайте условие, на което да съответства стойността на полето на документа.
Оператори на заявка за сравнение
- $eq (равно)
- $ne (не е равно)
- $gt (повече от)
- $lt (по-малко от)
- $gte (повече или равни)
- $lte (по-малко или равно)
- $in дефинира масив от стойности, една от които трябва да има поле за документ
- $nin дефинира масив от стойности, които не трябва да имат поле на документ
Например, ще намерим всички документи, които имат стойност на ключа за възраст под 30:
db.users.find ({age: {$lt : 30}})
Използването на други оператори за сравнение ще бъде подобно. Например същият ключ, само над 30:
db.users.find ({age: {$gt : 30}})
Обърнете внимание, че сравнението тук се прави върху цели числа, а не по низове. Ако възрастта на ключа представлява низови стойности, тогава сравнението трябва да се направи през редовете:db.users.find ({age:{$gt :“30”}}), но резултатът ще бъде същият.
Но нека си представим ситуация, в която трябва да намерим всички обеми със стойност на полето за възраст, по-голяма от 30, но по-малка от 50. В този случай можем да комбинираме два оператора:
db.users.find ({age: {$gt : 30, $lt: 50}})
Ще намерим потребители, чиято възраст е 22:
db.users.find ({age: {$eq : 22}})
По същество това е аналогията на следващата заявка:
db.users.find ({age: 22})
Обратна операция – намерете потребители, чиято възраст НЕ е 22:
db.users.find ({age: {$ne : 22}})
Операторът $in дефинира масив от възможни изрази и търси тези ключове, чиято стойност е в масива:
db.users.find ({age: {$in : [22, 32]}})
По обратния начин, операторът $nin дефинира масив от възможни изрази и търси тези ключове, чиято стойност липсва в този масив:
db.users.find ({age:{$nin :[22, 32]}})
Логически оператори
Логическите оператори се изпълняват при условия на извадка:
- $или :свързва две условия и документът трябва да отговаря на едно от тези условия
- $и: свързва две условия и документът трябва да отговаря на двете условия
- $не: документът НЕ трябва да отговаря на условието
- $nor: свързва две условия и документът НЕ трябва да отговаря на двете условия
Примерни оператори на MongoDB
Операторът $or представлява логическа операция ИЛИ и дефинира набор от двойки ключ-стойност, които трябва да присъстват в документа. И ако даден документ има поне една такава двойка ключ-стойност, той съответства на тази заявка и се извлича от базата данни:
db.users.find ({$or : [{name: "Tom"}, {age: 22}]})
Този израз ще върне всички документи с name=Tom или age=22.
Друг пример ще върне всички документи с name=Tom и age=22 или с „немски“ сред езиковите стойности:
db.users.find ({name: "Tom", $or : [{age: 22}, {languages: "german"}]})
Условните оператори могат да се използват в подизрази или подизрази:
db.users.find ({$or : [{name: "Tom"}, {age: {$gte:30}}]})
В този случай избираме всички документи, при които name=”Tom” или полето за възраст има стойност от 30 или по-висока.
Оператор $and
Операторът $and представлява логическа операция И (логическо умножение) и дефинира набор от критерии, на които трябва да отговаря даден документ. За разлика от оператора $or, документът трябва да отговаря на всички посочени критерии. Например:
db.users.find ({$and : [{name: "Tom"}, {age: 32}]})
Тук избраните документи трябва да имат името Том и възраст 32 – и двете функции.
Търсене в MongoDB масив
Някои оператори са проектирани да работят с масиви:
- $all: дефинира набор от стойности, които трябва да съществуват в масив
- $size: дефинира броя на елементите, които трябва да бъдат в масив
- $elemMatch: определя условието, на което трябва да отговарят елементите в масива
MongoDB $all
Операторът $all дефинира масив от възможни изрази и изисква документите да имат целия дефиниран набор от изрази. Съответно се използва за търсене в масива. Например, документите имат масив от езици, който съхранява чуждите езици, говорени от потребителя. И за да намерим всички хора, които говорят и английски, и френски едновременно, можем да използваме следния израз:
db.users.find ({languages: {$all : ["english", "french"]}})
Оператор $elemMatch
Операторът $elemMatch ви позволява да избирате документи, в които масивите съдържат елементи, които попадат при определени условия. Например, оставете базата данни да съдържа колекция от потребителски оценки за конкретни курсове. Нека добавим няколко документа:
db.grades.insertMany([{student: "Tom", courses:[{name: "Java", grade: 5}, {name: "MongoDB", grade: 4}]},
{student: "Alice", courses:[{name: "C++", grade: 3}, {name: "MongoDB", grade: 5}]}))
Всеки документ има масив, който от своя страна се състои от вложени документи.
Сега ще намерим студенти, които имат оценка над 3 за курса по MongoDB:
db.grades.find({courses: {$elemMatch: {name: "MongoDB", grade: {$gt: 3}}}})
Оператор $size
Операторът $size се използва за намиране на документи, в които масивите имат брой елементи, равни на стойността на $size. Например, нека извлечем всички документи, където има два елемента в масива laguages:
db.users.find ({languages: {$size:2}})
Такава заявка ще съответства например на следния документ:
{"name": "Tom", "age": 32, languages: ["english", "german"]}
Оператор $ съществува
Операторът $exists позволява да се извличат само онези документи, в които има или липсва определен ключ. Например върнете всички документи, които съдържат фирмения ключ:
db.users.find ({company: {$exists:true}})
Ако посочим $exists като параметър false, заявката ще ни върне само онези документи, които не съдържат фирмения ключ.
Оператор $type
Операторът $type извлича само онези документи, в които определен ключ има стойност от определен тип, например низ или число:
db.users.find ({age: {$type: "string"}})
> db.users.find ({age: {$type: "number"}})
Оператор $regex
Операторът $regex посочва регулярен израз, на който трябва да съответства стойността на полето . Например, нека името на полето задължително има буквата „b“:
db.users.find ({name: {$regex: "b"}})
Важно е да се разбере, че $regex не приема само низове, а регулярни изрази, например:name:{$regex:“om$”} – стойността на name трябва да завършва с “om”.