Основні команди MonogDB
Після підключення до хмарної бази MongoDB, клацніть правою кнопкою миші на будь-який базі у лівій панелі Robo 3T. У контекстному меню виберіть Open shell – відкриється консоль в який ми будемо працювати.
Перша команда буде
use test
Виконується вона натисканням клавіші F5 або комбінацією клавіш Ctrl+Enter. Тепер у
якості поточної буде встановлена БД test
.
Якщо ми хочемо дізнатися, яка бд використовується зараз, то ми можемо скористатися командою db:
db
Використовуючи команду db.stats()
, можна отримати статистику з поточної бази
даних, а статистику з колекції cats
:
db.cats.stats();
Але перш ніж отримати статистику з колекції, її треба створити.
Додавання до колекції
Можна використовувати для цього три методи:
insertOne
: додає один документinsertMany
: додає кілька документівinsert
: може додавати як один, так і кілька документів
Клацніть правою кнопкою миші по базі test
, у контекстному меню викличемо консоль та
вставимо інформацію по першому коту:
db.cats.insertOne({
name: 'barsik',
age: 3,
features: ['ходить у тапки', 'дає себе гладити', 'рудий'],
});
Нам повернеться результат:
{
"acknowledged": true,
"insertedId": ObjectId("5f837f855ba83a4f1829ca5b")
}
Він означає, що результат було додано до колекції cats
. Подвійним кліком по
імені cats
колекції в лівому меню ми відкриємо нову вкладку з консоллю, де
автоматично виконається команда
db.getCollection('cats').find({});
Є деякі обмеження щодо використання імен ключів:
- Символ
$
не може бути першим символом у імені ключа - Ім'я ключа не може містити символу крапки
.
- Ім'я
_id
не рекомендується використовувати
Використовуємо вставку даних відразу по двох кішках
db.cats.insertMany([
{
name: 'Lama',
age: 2,
features: ['ходить у лоток', 'не дає себе гладити', 'сірий'],
},
{
name: 'Liza',
age: 4,
features: ['ходить у лоток', 'дає себе гладити', 'білий'],
},
]);
Результат відповіді буде схожим на цей - нам повернули два унікальні ідентифікатора новостворених документів
{
"acknowledged": true,
"insertedIds": [
ObjectId("5f8382425ba83a4f1829ca5c"),
ObjectId("5f8382425ba83a4f1829ca5d")
]
}
І останній варіант – це універсальна вставка командою insert
db.cats.insert([
{
name: 'Boris',
age: 12,
features: ['ходить у лоток', 'не дає себе гладити', 'сірий'],
},
{
name: 'Murzik',
age: 1,
features: ['ходить у лоток', 'дає себе гладити', 'чорний'],
},
]);
Після цієї ставки в нашій колекції має бути п'ять документів
Пошук у колекції
Для виведення документів використовується метод find
:
db.cats.find();
Результат у консолі має бути на цей момент наступним
{
"_id" : ObjectId("5f837f855ba83a4f1829ca5b"),
"name" : "barsik",
"age" : 3.0,
"features" : [
"ходить у тапки",
"дає себе гладити",
"рудий"
]
}
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5c"),
"name" : "Lama",
"age" : 2.0,
"features" : [
"ходить у лоток",
"не дає себе гладити",
"сірий"
]
}
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5d"),
"name" : "Liza",
"age" : 4.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"білий"
]
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5e"),
"name" : "Boris",
"age" : 12.0,
"features" : [
"ходить у лоток",
"не дає себе гладити",
"сірий"
]
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5f"),
"name" : "Murzik",
"age" : 1.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"чорний"
]
}
У MongoDB у запитах можна використовувати умовні конструкції за допомогою операторів порівняння:
$eq
(дорівнює)$gt
(більше ніж)$lt
(менше ніж)$gte
(більше або дорівнює)$lte
(менше або дорівнює)
db.cats.find({ age: { $lte: 3 }, features: 'дає себе гладити' });
Результат:
{
"_id" : ObjectId("5f837f855ba83a4f1829ca5b"),
"name" : "barsik",
"age" : 3.0,
"features" : [
"ходить у тапки",
"дає себе гладити",
"рудий"
]
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5f"),
"name" : "Murzik",
"age" : 1.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"чорний"
]
}
Проекція
Іноді нам потрібна не вся інформація з документа, а, наприклад, певні поля або навпаки, деякі поля треба виключити
db.cats.find({ age: { $lte: 3 }, features: 'дає себе гладити' }, { name: 0 });
Результат, другим об'єктом у функції find
ми виключили виведення поля name
{
"_id" : ObjectId("5f837f855ba83a4f1829ca5b"),
"age" : 3.0,
"features" : [
"ходить у тапки",
"дає себе гладити",
"рудий"
]
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5f"),
"age" : 1.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"чорний"
]
}
А можемо навпаки, залишити висновок лише двох необхідних полів
db.cats.find(
{ age: { $lte: 3 }, features: 'дає себе гладити' },
{ name: 1, age: 1 },
);
Результат
{
"_id" : ObjectId("5f837f855ba83a4f1829ca5b"),
"name" : "barsik",
"age" : 3.0
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5f"),
"name" : "Murzik",
"age" : 1.0
}
Варто зауважити, що поле _id
виводиться завжди, якщо тільки примусово не
заборонити його виведення _id: 0
Запит до вкладених об'єктів
Давайте вставимо новий документ із полем об'єктом owners
db.cats.insert({
name: 'Dariy',
age: 10,
features: ['ходить у лоток', 'не дає себе гладити', 'сірий'],
owners: { name: 'Nata', age: 23, address: 'Poltava' },
});
Щоб виконати пошук по вкладеному об'єкту, треба використовувати точку
owners.name
db.cats.find({ 'owners.name': 'Nata' });
Результат:
{
"_id": ObjectId("5f838b225ba83a4f1829ca60"),
"name": "Dariy",
"age": 10.0,
"features": ["ходить у лоток", "не дає себе гладити", "сірий"],
"owners": {
"name": "Nata",
"age": 23.0,
"address": "Poltava"
}
}
Додаткове налаштування запитів:
Щоб обмежити вибірку, використовується функція limit
. Наприклад, показати перші
три документи в колекції
db.cats.find().limit(3);
Щоб пропустити кілька документів у вибірці використовується функція
skip
. Наприклад пропустити три документи у вибірці
db.cats.find().skip(3);
Сортування у вибірці виконується функцією sort
, яка приймає об'єкт з
полями для сортування і вони набувають значення: 1
за зростанням, -1
по
спаданню
db.cats.find().sort({ name: 1 });
За допомогою функції count()
можна отримати кількість елементів у колекції:
db.cats.count();
Результат: 6
Оператор $exists
дозволяє витягти тільки ті документи, в яких певний
ключ присутній або відсутній.
db.cats.find({ owners: { $exists: true } });
Оператор $type
витягує лише ті документи, у яких визначений ключ
має значення певного типу, наприклад, рядок чи число
db.cats.find({ age: { $type: 'number' } });
Оператор $regex
задає регулярний вираз, якому має відповідати
значення поля.
db.cats.find({ name: { $regex: 'L' } });
Результат:
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5c"),
"name" : "Lama",
"age" : 2.0,
"features" : [
"ходить у лоток",
"не дає себе гладити",
"сірий"
]
}
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5d"),
"name" : "Liza",
"age" : 4.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"білий"
]
}
Оператор логічного множення $or
, дозволяє об'єднати вибірки
db.cats.find({ $or: [{ name: { $regex: 'L' } }, { age: { $lte: 3 } }] });
Результат:
{
"_id" : ObjectId("5f837f855ba83a4f1829ca5b"),
"name" : "barsik",
"age" : 3.0,
"features" : [
"ходить у тапки",
"дає себе гладити",
"рудий"
]
}
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5c"),
"name" : "Lama",
"age" : 2.0,
"features" : [
"ходить у лоток",
"не дає себе гладити",
"сірий"
]
}
{
"_id" : ObjectId("5f8382425ba83a4f1829ca5d"),
"name" : "Liza",
"age" : 4.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"білий"
]
}
{
"_id" : ObjectId("5f8383025ba83a4f1829ca5f"),
"name" : "Murzik",
"age" : 1.0,
"features" : [
"ходить у лоток",
"дає себе гладити",
"чорний"
]
}
Оператор логічного множення $and
, знаходить перетин вибірок
db.cats.find({ $and: [{ name: { $regex: 'L' } }, { age: { $lte: 3 } }] });
Результат:
{
"_id": ObjectId("5f8382425ba83a4f1829ca5c"),
"name": "Lama",
"age": 2.0,
"features": ["ходить у лоток", "не дає себе гладити", "сірий"]
}
Курсори
Результат вибірки, яка отримується за допомогою функції find
, називається курсором.
Курсори інкапсулюють у собі набори одержуваних з БД об'єктів. Використовуючи
синтаксис мови JavaScript та методи курсорів, ми можемо вивести отримані
документи на екран і якось їх обробити.
const cursor = db.cats.find();
while (cursor.hasNext()) {
obj = cursor.next();
print(obj['name']);
}
Результат:
barsik
Lama
Liza
Boris
Murzik
Dariy
Збереження документів
Збереження документів можна виконати методами save. У новий документ в якості
поля можна передати параметр _id
. Якщо метод знаходить документ з таким
значенням _id
, то документ оновлюється. Якщо ж із подібним _id
немає
документів, то документ вставляється.
db.cats.save({ name: 'Bars', age: 3 });
Оновлення документів
Більш детальне налаштування під час оновлення пропонує функція update
. Вона
приймає три параметри:
query
: приймає запит на вибірку документа, який потрібно оновитиobjNew
: представляє документ із новою інформацією, який замістить старий при оновленніoptions
: визначає додаткові параметри під час оновлення документів. Може приймати два аргументи:upsert
таmulti
.
Якщо параметр upsert
має значення true
, що MongoDB оновлюватиме
документ, якщо його знайдено, і створювати новий, якщо такого документа немає. Якщо ж
він має значення false
, то MongoDB не буде створювати новий документ, якщо
запит на вибірку не знайде жодного документа.
Параметр multi
вказує, чи повинен оновлюватися перший елемент у вибірці
(використовується за замовчуванням, якщо цей параметр не вказано) або повинні
оновлюватися всі документи у вибірці.
db.cats.update({ name: 'Bars' }, { name: 'Tom', age: 5 }, { upsert: true });
оператор $set
- якщо документ не містить оновлюване поле, то воно створюється
db.cats.update(
{ name: 'Tom' },
{ $set: { features: ['ходить у лоток', 'не дає себе гладити', 'сірий'] } },
);
Вказавши значення multi:true
, ми можемо оновити всі документи вибірки
{multi:true}
Для видалення окремого ключа використовується оператор $unset
:
db.cats.update({ name: 'Tom' }, { $unset: { age: 1 } });
Метод updateOne
схожий на метод update
за тим винятком, що він оновлює
лише один документ. Якщо потрібно оновити всі документи, які відповідають
деякому критерію, то застосовується метод updateMany
Видалення документа
Для видалення документів у MongoDB передбачено метод remove
:
Видалення всіх документів із зазначеним запитом
db.cats.remove({ name: 'Tom' });
Якщо потрібно видалити, лише один документ
db.cats.remove({ name: 'Tom' }, true);