Перейти до основного вмісту

Основні команди MonogDB

Після підключення до хмарної бази MongoDB, клацніть правою кнопкою миші на будь-який базі у лівій панелі Robo 3T. У контекстному меню виберіть Open shell – відкриється консоль в який ми будемо працювати.

Перша команда буде

use test

Виконується вона натисканням клавіші F5 або комбінацією клавіш Ctrl+Enter. Тепер у якості поточної буде встановлена ​​БД test.

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({});

insert

Є деякі обмеження щодо використання імен ключів:

  1. Символ $ не може бути першим символом у імені ключа
  2. Ім'я ключа не може містити символу крапки .
  3. Ім'я _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: ['ходить у лоток', 'дає себе гладити', 'чорний'],
},
]);

Після цієї ставки в нашій колекції має бути п'ять документів

five

Пошук у колекції

Для виведення документів використовується метод 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. Вона приймає три параметри:

  1. query: приймає запит на вибірку документа, який потрібно оновити
  2. objNew: представляє документ із новою інформацією, який замістить старий при оновленні
  3. 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);