ProgIngContrSystems

Матеріали дисципліни "Програмна інженерія в системах управління"

На головну

MongoDB

https://www.mongodb.com/docs/manual/

Версія спільноти нашої розподіленої бази даних пропонує гнучку модель даних документів разом із підтримкою спеціальних запитів, вторинного індексування та агрегацій у реальному часі, щоб забезпечити ефективні способи доступу та аналізу ваших даних. https://www.mongodb.com/try/download/community

База даних також пропонується як повністю керована служба з MongoDB Atlas. Отримайте доступ до розширених функцій, таких як автоматичне масштабування, безсерверні екземпляри (у попередньому перегляді), повнотекстовий пошук і розподіл даних між регіонами та хмарами. Розгорніть за лічені хвилини в AWS, Google Cloud і/або Azure без завантажень.

У цьому розділі надається загальна інформація по MongoDB. Також Ви можете почитати про різні функції за наступними посиланнями в цьому репозиторії:

Вступ до MongoDB

Запис у MongoDB — це документ, який є структурою даних, що складається з пар полів і значень. Документи MongoDB схожі на об’єкти JSON. Значення полів можуть містити інші документи, масиви та масиви документів.

A MongoDB document.

Перевагами використання документів є:

  • Документи відповідають рідним типам даних у багатьох мовах програмування.
  • Вбудовані документи та масиви зменшують потребу у дорогих об’єднаннях.
  • Динамічна схема підтримує плавний поліморфізм.

MongoDB зберігає документи в колекціях. Колекції аналогічні таблицям у реляційних базах даних.

Окрім колекцій, MongoDB підтримує:

MongoDB забезпечує високу продуктивність збереження даних. Зокрема,

  • Підтримка вбудованих моделей даних зменшує активність вводу-виводу в системі бази даних.
  • Індекси підтримують швидші запити та можуть містити ключі з вбудованих документів і масивів.

MongoDB Query API підтримує операції читання та запису (CRUD), а також:

Засіб реплікації MongoDB під назвою набір реплік забезпечує:

  • автоматичне відновлення після відмови
  • дублювання даних

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

MongoDB забезпечує горизонтальну масштабованість як частину своєї основної функціональності:

  • Sharding розподіляє дані між кластером машин.
  • Починаючи з версії 3.4, MongoDB підтримує створення зон даних на основі shard key. У збалансованому кластері MongoDB спрямовує читання та запис, охоплені зоною, лише до сегментів усередині зони. Для отримання додаткової інформації перегляньте сторінку посібника Зони.

MongoDB підтримує кілька механізмів зберігання:

Крім того, MongoDB надає підключаємий API механізму зберігання, який дозволяє третім сторонам розробляти механізми зберігання для MongoDB.

Databases and Collections

MongoDB зберігає записи даних як документи (BSON documents), які зібрані разом у колекції. База даних зберігає одну або кілька колекцій документів. Щоб вибрати базу даних для використання, у mongosh видайте оператор use <db>, як у наступному прикладі:

use myDB

Якщо база даних не існує, MongoDB створює базу даних, коли ви вперше зберігаєте дані для цієї бази даних. Таким чином, ви можете перейти до неіснуючої бази даних і виконати наступну операцію в mongosh:

use myNewDB

db.myNewCollection1.insertOne( { x: 1 } )

Операція insertOne() створює як базу даних ` myNewDB і колекція myNewCollection1`, якщо вони ще не існують. Переконайтеся, що назви бази даних і колекції відповідають MongoDB Обмеження імен.

MongoDB зберігає документи в колекціях. Колекції аналогічні таблицям у реляційних базах даних.

A collection of MongoDB documents.

Якщо колекція не існує, MongoDB створює колекцію, коли ви вперше зберігаєте дані для цієї колекції.

db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )

І insertOne(), і createIndex () операції створюють відповідну колекцію, якщо вони ще не існують. Переконайтеся, що назва колекції відповідає MongoDB Обмеження імен.

MongoDB надає метод db.createCollection() для явного створення колекції з різними параметрами, такими як встановлення максимального розміру або правил перевірки документації. Якщо ви не вказуєте ці параметри, вам не потрібно явно створювати колекцію, оскільки MongoDB створює нові колекції, коли ви вперше зберігаєте дані для колекцій. Щоб змінити ці параметри колекції, перегляньте collMod.

За замовчуванням колекція не вимагає, щоб її документи мали однакову схему; тобто документи в одній колекції не обов’язково мають однаковий набір полів, а тип даних для поля може відрізнятися для різних документів у колекції.

Однак, починаючи з MongoDB 3.2, ви можете застосувати правила перевірки документів для колекції під час операцій оновлення та вставки. Перегляньте Перевірка схеми, щоб отримати докладнішу інформацію.

Щоб змінити структуру документів у колекції, наприклад додати нові поля, видалити існуючі поля або змінити значення полів на новий тип, оновіть документи до нової структури.

Колекціям призначається незмінний UUID. UUID колекції залишається незмінним для всіх членів набору реплік і фрагментів у сегментованому кластері.

Щоб отримати UUID для колекції, запустіть команду listCollections або db.getCollectionInfos().

Documents

MongoDB зберігає записи даних як документи BSON. BSON — це двійкове представлення документів JSON, хоча воно містить більше типів даних, ніж JSON. Специфікацію BSON див. на bsonspec.org. Дивіться також Типи BSON.

A MongoDB document.

Документи MongoDB складаються з пар полів і значень і мають таку структуру:

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

Значення поля може бути будь-яким із типів даних BSON , включаючи інші документи, масиви та масиви документів. Наприклад, такий документ містить значення різних типів:

var mydoc = {
               _id: ObjectId("5099803df3f4948bd2f98391"),
               name: { first: "Alan", last: "Turing" },
               birth: new Date('Jun 23, 1912'),
               death: new Date('Jun 07, 1954'),
               contribs: [ "Turing machine", "Turing test", "Turingery" ],
               views : NumberLong(1250000)
            }

Наведені вище поля мають такі типи даних:

  • _id містить ObjectId.
  • name містить вбудований документ, який містить поля first та last.
  • birth і death містять значення типу Date.
  • contribs містить масив рядків.
  • views містить значення типу NumberLong.

Імена полів

Імена полів є рядками.

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

  • Ім’я поля _id зарезервовано для використання в якості первинного ключа; його значення має бути унікальним у колекції, є незмінним і може бути будь-якого типу, крім масиву. Якщо _id містить підполя, назви підполів не можуть починатися з символу ($).

  • Імена полів не можуть містити символ null.
  • Сервер дозволяє зберігати назви полів, які містять крапки (.) і знаки долара ($). — MongodB 5.0 додає покращену підтримку використання ($) і (.) у назвах полів. Є деякі обмеження. Додаткову інформацію див. у розділі Зауваження щодо імен полів.

Документи BSON можуть мати більше одного поля з однаковою назвою. Однак більшість інтерфейсів MongoDB представляють MongoDB зі структурою (наприклад, хеш-таблицею), яка не підтримує повторювані імена полів. Якщо вам потрібно маніпулювати документами, які мають більше ніж одне поле з однаковою назвою, перегляньте документацію драйвера для вашого драйвера.

Деякі документи, створені внутрішніми процесами MongoDB, можуть мати повторювані поля, але жоден процес MongoDB ніколи не додасть повторювані поля до існуючого документа користувача.

Обмеження значення поля

Крапкова нотація

MongoDB використовує крапкову нотацію для доступу до елементів масиву та для доступу до полів вбудованого документа.

Масиви

Щоб указати або отримати доступ до елемента масиву за позицією індексу від нуля, об’єднайте назву масиву з крапкою (.) і позицією індексу від нуля та візьміть у лапки:

"<array>.<index>"

Наприклад, задано таке поле в документі:

{
   ...
   contribs: [ "Turing machine", "Turing test", "Turingery" ],
   ...
}

Щоб указати третій елемент у масиві contribs, використовуйте позначення "contribs.2" із крапкою.

Приклади запитів до масивів див.:

Дивись також:

  • $[] всі позиційні оператори для операцій оновлення,
  • $[<identifier>] відфільтрований позиційний оператор для операцій оновлення,
  • $ позиційний оператор для операцій оновлення,
  • $ оператор проекції, коли позиція індексу масиву невідома
  • Query an Array для прикладів точкової нотації з масивами.

Вбудовані документи

Щоб указати або отримати доступ до поля вбудованого документа за допомогою крапкової нотації, об’єднайте ім’я вбудованого документа з крапкою (.) і ім’ям поля та візьміть їх у лапки:

"<embedded document>.<field>"

Наприклад, задано таке поле в документі:

{
   ...
   name: { first: "Alan", last: "Turing" },
   contact: { phone: { type: "cell", number: "111-222-3333" } },
   ...
}
  • Щоб указати поле з назвою last у полі name, використовуйте позначення з крапкою "name.last".
  • Щоб вказати number у документі phone у полі contact, використовуйте позначення з крапкою "contact.phone.number".

Приклади запиту вбудованих документів див.

Обмеження документів

Документи мають такі атрибути:

Обмеження розміру документа

Максимальний розмір документа BSON становить 16 мегабайт.

Максимальний розмір документа допомагає гарантувати, що окремий документ не може використовувати надмірний обсяг оперативної пам’яті або, під час передачі, надмірну пропускну здатність. Щоб зберігати документи, розмір яких перевищує максимальний, MongoDB надає GridFS API. Перегляньте mongofiles і документацію для вашого драйвера, щоб дізнатися більше про GridFS.

Порядок полів документа

На відміну від об’єктів JavaScript, поля в документі BSON впорядковані.

Порядок полів у запитах

Для запитів порядок полів виглядає наступним чином:

  • Під час порівняння документів упорядкування полів є важливим. Наприклад, при порівнянні документів із полями a і b у запиті:
    • {a: 1, b: 1} дорівнює {a: 1, b: 1}
    • {a: 1, b: 1} не дорівнює {b: 1, a: 1}
  • Для ефективного виконання запиту система запитів може змінити порядок полів під час обробки запиту. Крім інших випадків, під час обробки цих операторів проекції може виникнути зміна порядку полів: $project, $addFields, $set і $unset.
    • Зміна порядку полів може відбуватися як у проміжних результатах, так і в кінцевих результатах, які повертає запит.
    • Оскільки деякі операції можуть змінювати порядок полів, не слід покладатися на конкретне впорядкування полів у результатах, які повертає запит, який використовує оператори проекції, перелічені раніше.

Порядок полів в операціях запису

Для операцій запису MongoDB зберігає порядок полів документа за винятком таких випадків:

  • Поле _id завжди є першим полем у документі.
  • Оновлення, які включають перейменування імен полів, можуть призвести до зміни порядку полів у документі.

Поле _id

У MongoDB для кожного документа, що зберігається в колекції, потрібне унікальне поле _id, яке діє як первинний ключ. Якщо у вставленому документі немає поля _id, драйвер MongoDB автоматично генерує ObjectId для поля _id.

Це також стосується документів, вставлених через операції оновлення з upsert: true.

Поле _id має таку поведінку та обмеження:

  • За замовчуванням MongoDB створює унікальний індекс у полі _id під час створення колекції.

  • Поле _id завжди є першим полем у документах. Якщо сервер спочатку отримує документ, у якому немає поля _id, тоді сервер перемістить поле на початок.

  • Якщо _id містить підполя, імена підполів не можуть починатися із символом ($).

  • Поле _id може містити значення будь-якого типу даних BSON, крім array, regex або undefined.

Увага. Щоб забезпечити функціонування реплікації, не зберігайте у полі _id значення типу регулярного виразу BSON

Нижче наведено загальні варіанти збереження значень для _id:

  • використовуючи ObjectId.

  • використовуючи природний унікальний ідентифікатор, якщо він є. Це економить місце та дозволяє уникнути додаткового індексу.

  • Створенням автоматичного збільшення числа.

  • Генеруванням UUID у коді програми. Для більш ефективного зберігання значень UUID у колекції та в індексі _id зберігайте UUID як значення типу BSON BinData.

    Ключі індексу типу “BinData” зберігаються в індексі ефективніше, якщо:

    • значення двійкового підтипу знаходиться в діапазоні 0-7 або 128-135, і
    • довжина байтового масиву: 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24 або 32.
  • використовуючи засіб BSON UUID вашого драйвера для створення UUID. Майте на увазі, що реалізації драйверів можуть реалізовувати логіку серіалізації та десеріалізації UUID по-різному, що може бути не повністю сумісним з іншими драйверами. Перегляньте документацію драйвера для інформації щодо сумісності UUID.

Примітка. Більшість клієнтів драйверів MongoDB включають поле _id і генерують ObjectId перед надсиланням операції вставки в MongoDB; однак, якщо клієнт надсилає документ без поля _id, mongod додасть поле _id і згенерує ObjectId.

Інше використання структури документа

На додаток до визначення записів даних, MongoDB використовує всю структуру документа, включаючи, але не обмежуючись: фільтри запитів, документи специфікацій оновлення і документи специфікацій індексу

Документи фільтра запитів

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

Ви можете використовувати вирази <поле>:<значення>, щоб указати умову рівності та вирази оператора запиту.

{
  <field1>: <value1>,
  <field2>: { <operator>: <value> },
  ...
}

Для прикладів див.

Оновити специфікаційні документи

У документах специфікації оновлення використовуються оператори оновлення, щоб указати модифікації даних для певних полів під час операція оновлення.

{
  <operator1>: { <field1>: <value1>, ... },
  <operator2>: { <field2>: <value2>, ... },
  ...
}

Для прикладів див Update specifications.

Специфікаційні документи індексу

Документи специфікації індексу визначають поле для індексування та тип індексу:

{ <field1>: <type1>, <field2>: <type2>, ...  }