Введение в MongoDB


MongoDB - это ведущее решение NoSQL, которое обеспечивает возможности хранилищ данных с гибкой схемой, предлагая разработчикам быстрый, простой и естественный способ создания приложений.

Хранилища данных NoSQL произвели революцию в разработке программного обеспечения, обеспечив большую гибкость в управлении данными. Одним из выдающихся решений NoSQL является MongoDB, хранилище данных, ориентированное на документы. В этой статье мы рассмотрим, что такое MongoDB и как он может удовлетворить ваши требования к приложениям.

Реляционные базы данных хранят информацию в строго регламентированных таблицах и столбцах. MongoDB - это хранилище документов, в котором хранится информация в коллекциях и документах. Основное различие здесь заключается в том, что коллекции и документы неструктурированы, иногда их называют бессхемными. Это означает, что структура экземпляра MongoDB (коллекции и документы) не является предопределенной и изменяется для размещения любых данных, помещенных в нее.

Документ - это набор значений ключа, который ведет себя очень похоже на объект в коде, таком как JavaScript: его структура меняется в зависимости от введенных в него данных. Это делает кодирование в хранилище данных, таком как MongoDB, более простым и гибким, чем кодирование в реляционном хранилище данных. Проще говоря, взаимодействие между кодом приложения и хранилищем данных документов кажется более естественным.

На рисунке ниже наглядно показана структура коллекций и документов в базе данных MongoDB.

Хранилище документов MongoDB
Хранилище документов MongoDB

Гибкость, присущая этому типу моделирования данных, означает, что данные могут обрабатываться в большей степени по мере необходимости, что обеспечивает преимущества в производительности. Чтобы получить конкретное понимание этой разницы, сравните следующие два способа выполнения одной и той же задачи (создание записи и последующее добавление поля из приложения) сначала в реляционной базе данных, а затем в MongoDB.

# создаем базу данных:
CREATE DATABASE menagerie;

# создаем таблицу в базе данных: 
USE menagerie; CREATE TABLE pet (name VARCHAR(20));

# вставляем запись в таблицу: 
INSERT INTO pet (name) VALUES ('Friar Tuck');

# добавляем столбец: 
ALTER TABLE pet ADD type VARCHAR(20));

# обновляем запись: 
UPDATE pet SET type = 'cat' WHERE name = 'Friar Tuck'
Теперь для того же процесса с MongoDB:

# соединяемся с бд и вставляем запись: 
use menagerie; db.pet.insertOne({name:"friar tuck"});

# обновляем: 
db.pet.updateOne({ name:'friar tuck' }, { $set:{ type: 'cat' } } );
Из предыдущего вы можете получить представление о том, насколько более плавным может быть процесс разработки с MongoDB. Такая гибкость, конечно, ложится бременем на разработчика, чтобы избежать раздувания схемы. Для крупномасштабных приложений важно сохранять контроль над структурой документов.

Поле идентификатора в MongoDB

В реляционной базе данных у вас есть понятие первичного ключа, и это часто столбец синтетического идентификатора (то есть сгенерированное значение, не связанное с бизнес-данными). В MongoDB каждый документ имеет поле _id аналогичного назначения. Если вы, как разработчик, не предоставите идентификатор при создании документа, он будет автоматически сгенерирован (как UUID) механизмом MongoDB.

Как и первичный ключ, поле _id автоматически индексируется и должно быть уникальным.

Индексирование в MongoDB

Индексирование в MongoDB ведет себя аналогично индексированию в реляционной базе данных: оно создает дополнительные данные о поле документа, чтобы ускорить поиск, основанный на этом поле. MongoDB использует индексы B-дерева. Индекс может быть создан с таким синтаксисом:

db.pet.createIndex( { name: 1 } )
Целое число в параметре указывает, является ли индекс возрастающим (1) или убывающим (-1).

Вложенные документы в MongoDB

Мощным аспектом документоориентированной структуры MongoDB является то, что документы могут быть вложенными. Например, вместо создания другой таблицы для хранения адресной информации для документа pet можно создать вложенный документ со структурой, подобной листингу 1.

Листинг 1. Пример вложенного документа

{
  "_id": "5c224029caff8856591b0ce7d",
  "name": "Barsik",
  "address": {
    "street": "Krasnaya",
    "city": "Vologda",
    "state": "Vologda region"
  },
  "type": "cat"
}
Денормализация в MongoDB

Хранилища документов, такие как MongoDB, имеют несколько ограниченную поддержку соединений (для получения дополнительной информации прочитайте эту статью), и нет понятия внешнего ключа. И то, и другое является следствием динамической природы структуры данных. Моделирование данных в MongoDB имеет тенденцию к денормализации, то есть дублированию данных в документах, вместо строгого хранения данных в табличных хранилищах. Это повышает скорость поиска за счет повышения согласованности данных.

Денормализация не является обязательным требованием, но скорее тенденцией при использовании баз данных, ориентированных на документы. Это связано с улучшенной способностью работать со сложными вложенными записями, в отличие от тенденции SQL сохранять данные нормализованными (т. Е. не дублированными) в определенных столбцах с одним значением.

Язык запросов MongoDB

Язык запросов в MongoDB ориентирован на JSON, как и структура документа. Это обеспечивает очень мощный и выразительный синтаксис, который может обрабатывать даже сложные вложенные документы.

Например, вы можете запросить нашу теоретическую базу данных для всех кошек, выдав db.pet.find({ "тип" : "кошка" }) или всех кошек в Калифорнии с помощью db.pet.find({ "тип" : "кошка", "адрес.штат": "Калифорния" }). Обратите внимание, что язык запросов проходит через вложенный адресный документ.

Синтаксис обновления MongoDB

Синтаксис alter в MongoDB также использует формат, подобный JSON, где ключевое слово $set указывает, какое поле изменится, до какого значения. Объект set поддерживает вложенные документы с помощью точечной нотации, как в листинге 2, где вы меняете почтовый индекс для кота по имени "Барсик".

Листинг 2. Обновление вложенного документа

db.people.update(
  {
    "type": "cat",
    "name": "Barsik"
  },
  {
     $set: {
       "address.zip": "86004"
     }
  }
)
Из листинга 2 вы можете видеть, что синтаксис обновления ничуть не менее мощный — фактически более мощный — чем эквивалент SQL.

Облако MongoDB и варианты развертывания

MongoDB предназначен для масштабируемости и распределенного развертывания. Он полностью способен обрабатывать рабочие нагрузки веб-масштаба.

MongoDB компания предлагает решение для кластеризации многооблачных баз данных в MongoDB Atlas. MongoDB Atlas действует как управляемая база данных, которая может охватывать различные облачные платформы и включает в себя корпоративные функции, такие как мониторинг и отказоустойчивость.

Вы получаете представление о важности MongoDB в том, что предложение Amazon DocumentDB от AWS включает совместимость с MongoDB в качестве главного пункта продажи. Microsoft Azure Cosmos DB следует аналогичной схеме с поддержкой API MongoDB.

Высокая доступность в MongoDB

MongoDB поддерживает наборы реплик для обеспечения высокой доступности. Основная идея заключается в том, что данные записываются один раз в основной экземпляр, а затем дублируются во вторичные хранилища для чтения.

Суть в том, что MongoDB является ведущим решением NoSQL, которое обеспечивает возможности хранения данных с гибкой схемой. Расширенные драйверы доступны практически для каждого языка программирования, и вы также можете использовать множество вариантов развертывания.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.



тегизаметки, базы данных, MongoDB, теория программирования




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Эпическое фэнтези с множеством интриг, подходящее для читателей любого возраста
C#: объединение текстовых файлов с одинаковыми именами из разных папок
Урок 22. Функции поиска в строках C#