Приклади основних запитів 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 для більших значень.
| $gt | більше | |
| >= | $gte | більше або дорівнює |
| <> | $ne | не дорівнює |
| NOT | $not | заперечення |
| EXISTS | $exists | перевірка існування поля |
| OR | $or | або |
| NOT OR | $nor | не чи |
| RLIKE, REGEXP | $regex | відповідність регулярному виразу |
| LIKE | $elemMatch | відповідність усіх полів вкладеного документа |
| - | $size | відповідність розміру масиву |
| - | $type | відповідність, якщо поле має вказаний тип |
| IN | $in | входить до списку |
| NOT IN | $nin | не входить до списку |
| ALL | $all | одночасний збіг набору елементів |
Для оновлення використовується метод 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" можна за допомогою наступної команди