Приклади основних запитів MongoDB

Хоча деякі писали щодо мого попереднього топіка MongoDB: Створення, оновлення та видалення документів, що це переказ офф. документації, я з цим не повністю погоджуюся. Мені здалося, що інформація в ньому виявилася комусь корисною, тож викладаю продовження.

Find - аналог SELECT в MySQL. Використовується для вибірки документів із MongoDB. Повертає масив документів як колекції, якщо документів немає — порожню колекцію. Приклад:

Поверне всіх користувачів із колекції.

Поверне всіх користувачів, які мають вік 27.

Можна вказувати кілька параметрів, наприклад, ось так: Іноді буває необхідно отримати якісь конкретні поля з документів. У цьому випадку запит виглядає так: У результаті отримаємо всіх користувачів тільки з полями "username" та "email" + поле "_id", яке завжди повертається за замовчуванням. Якщо поле "_id" або якесь інше не потрібне, ми можемо це вказати ось так: Запити з умовою

Оператори: $lt — менше, $lte — менше чи одно, $gt — більше, $gte — більше, $ne — не дорівнює. Приклади використання: Отримуємо всіх користувачів, вік яких більше 18 і менше 30 Отримуємо всіх користувачів, «username» яких не дорівнює joe

Припустимо, у нас колекція зберігає лотерейні квитки з номерами і нам потрібно знайти тільки ті, в яких є номери 390, 754, 454, що перемогли. У такому випадку ми використовуємо оператор $in:

тобто. квиток має містити один із цих номерів. Протилежним оператором $in є $nin. Він, за аналогією, отримує лише ті квитки, де немає зазначених вище номерів. Оператор $or використовується при запитах, коли потрібно вибрати документи щодо збігу одного зі значень. Наприклад, нам потрібно вибрати всі квитки з номером547 або де поле "winner" дорівнює true: Оператор $mod використовується для вибірки ключів, значення яких діляться на перший аргумент і залишок від розподілу виходить рівним другому аргументу. Звучить незрозуміло, ось наочно:

Такий запит поверне всіх користувачів, user_id яких дорівнює 1, 6, 11, 16 і так далі. Щоб отримати всіх користувачів, крім вищезгаданих можна використовувати оператор $not:

Отримаємо користувачів з user_id 2, 3, 4, 5, 7, 8, 9, 10, 12 і так далі. Існує також оператор для перевірки чи існує якийсь ключ чи ні — $exist

Так можна вибрати всі документи колекції, де існує ключ "z" і він дорівнює null.

Всі ми знаємо, що регулярні вирази дуже потужна штука. MongoDB використовує Perl-сумісні регулярні вирази. Ось так можна знайти всіх користувачів з ім'ям joe або joe:

Взагалі, є де розгулятися. Є купа сервісів для того ж Javascript'a, де можна писати і перевіряти свої регулярки.

Запити у масивах

Припустимо, є у нас колекція food і ми туди вставляємо документ з масивом фруктів.

То такий запит

успішно його знайде. Якщо потрібно вибрати документи більше, ніж по одному елементу масиву, ми можемо використовувати оператор $all

Такий запит поверне всі документи, в масиві фруктів яких є і яблука, і банани. Отримати документи щодо повного збігу елементів у масиві можемо так:

findOne - працює аналогічно find, але повертає перший збіг документ.

Також $slice вміє отримувати документи із середини:

у цьому випадку буде пропущено 23 початкові елементи і повернуться елементи з 24 по 34, якщо це можливо

Команди limit, skip та sort

Для того, щоб отримати обмежену кількість документів позапитом використовується команда limit:

Поверне перших трьох користувачів. Для того, щоб пропустити кілька документів і отримати решту використовується команда skip:

Отримуємо всіх користувачів, крім перших трьох. Для сортування використається команда sort. Сортування може бути за зростанням (1) та за зменшенням (- 1). Сортування може проводитись за кількома ключами в порядку їхнього пріоритету:

Всі ці три команди можна використовувати разом:

db.stock.find( < "desc" : "mp3" >).limit(50).skip(50).sort( < "price" : -1 >); Використання команди skip з великими значеннями працює не дуже швидко. Розглянемо це з прикладу пагінації:

Найпростіший спосіб зробити пагінацію це вперше повернути фіксовану кількість документів, а потім щоразу зміщувати діапазон на це значення

але це буде працювати досить повільно. Допустимо ми будемо робити вибірку щодо дати створення документа:

Сортуємо за зменшенням та беремо перші 100. Щоб не робити skip ми можемо отримати дату останнього документа і зробити запит вже щодо цієї дати:

Так можна уникнути використання команди skip для більших значень.

Оператор SQL MongoDB Опис
$gtбільше
>=$gteбільше або дорівнює
<>$neне дорівнює
NOT$notзаперечення
EXISTS$existsперевірка існування поля
OR$orабо
NOT OR$norне чи
RLIKE, REGEXP$regexвідповідність регулярному виразу
LIKE$elemMatchвідповідність усіх полів вкладеного документа
-$sizeвідповідність розміру масиву
-$typeвідповідність, якщо поле має вказаний тип
Робота зі спискамиДля роботи зі списками призначені оператори $in, $nin та $all.Оператор SQL MongoDB Опис
IN$inвходить до списку
NOT IN$ninне входить до списку
ALL$allодночасний збіг набору елементів
Оператор $in отримує записи для яких задане значення збігається хоча б з одним зі списку. Нижче виводиться запит, який отримує записи, поле title яких збігається з одним із значень у списку ['MongoDB', 'MySQL']:

Для оновлення використовується метод update, перший аргумент якого визначає список документів, що оновлюються, другий — як відібрані документи модифікуються. Наступна команда додає до документа з назвою "MongoDB" додаткове поле nosql, зі значенням "true":

Якщо оновлене піддається лише одне поле, слід обов'язково використовувати оператор $set. Якщо його опустити, замість оновлення поля буде оновлено весь документ:

Для видалення додаткового поля nosql замість оператора $set слід підставити $unset

Для того, щоб додати ключове слово до масиву тегів tags бази даних articles слід скористатися оператором $addToSet

Якщо запитати склад поточної бази даних за допомогою find(), можна помітити, що оновився лише один документ з двох, які мають ключове слово "Redis". Щоб оновити всі документи, слід передати четвертому параметру методу update() значення true, що змусить MongoDB оновити всі знайдені документи

Нижче наводиться зведена таблиця пооператорам, які використовуються спільно з методом update()

Оператор Опис
$setоновлення або створення поля
$unsetвидалення поля
$incзбільшення значення поля на задане число
$popвидаляє останній (або перший) елемент масиву
$pushAllпоміщає кілька елементів у масив
$pushпоміщає новий елемент у масив
$addToSetпоміщає новий елемент у масив (виключаються дублікати)
$pullвидаляє з масиву значення (за його наявності)
$pullAllвидаляє з масиву всі відповідні значення

Повністю видалити документи з поточної бази даних можна за допомогою remove()

Так само, як і інші методи, як параметр метод може приймати селектори, наприклад, видалити всі записи в ключі nosql рівним "true" можна за допомогою наступної команди