MongoDB

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 23:43, 17 мая 2020.
MongoDB
MongoDB-Logo.svg
Разработчики: MongoDB Inc.
Выпущена: February 2009, 11 (11-02-2009)[Источник 1]
Постоянный выпуск: 4.2.6[Источник 2] / 21 April 2020 года; 18 months ago (2020-04-21)
Предыдущий выпуск: 4.2.2-rc1[Источник 3] / 5 December 2019 года; 23 months ago (2019-12-05)
Состояние разработки: Активное
Написана на: C++, C и JavaScript
Операционная система: Windows Vista и позднее, Linux, macOS 10.7 и позднее, Solaris,[Источник 4] FreeBSD[Источник 5]
Локализация: Английский язык
Тип ПО: Document-oriented database
Лицензия: Various; see § Licensing
Веб-сайт mongodb.org

MongoDB (от humongous) — кроссплатформенная документо-ориентированная система управления базами данных. Классифицированная как база данных NoSQL, MongoDB отходит от традиционных основ реляционной структуры базы данных в пользу JSON-подобных документов с динамическими схемами (MongoDB называет этот формат BSON), что делает интеграцию данных в определенных видах приложений проще и быстрее. Выпущено под комбинацией GNU Affero General Public License и лицензией Apache, MongoDB является бесплатным программным обеспечением с открытым исходным кодом.

Впервые разработанный софтверной компанией MongoDB Inc. в октябре 2007 года в качестве компонента запланированной площадке в качестве продукта обслуживания, компания смещается к модели развития с открытым исходным кодом в 2009 году, с MongoDB предлагает коммерческую поддержку и другие услуги [Источник 6]. С тех пор, MongoDB был принят в качестве серверной программного обеспечения в ряде крупных веб-сайтов и услуг, в том числе Craigslist, eBay, и Foursquare и другие. По состоянию на май 2020 года, MongoDB является пятым наиболее популярный тип системы управления базами данных[Источник 7].

Основные особенности

Документо-ориентированность
Вместо того, чтобы брать бизнес-объект и разбить его на несколько реляционных структур, MongoDB может хранить бизнес объект в минимальном количестве документов. Например, вместо того, чтобы хранить название и сведения об авторе в двух различных реляционных структур, название, автор, и другой информации в заголовке, связанных могут быть сохранены в одном документе под названием Книга.

Специальные запросы
MongoDB поддерживает поиск по области, запросов по диапазону, поиск регулярного выражения. Запросы могут возвращать определенные поля документов, а также включают в себя пользовательские функции JavaScript.

Индексация
Любое поле в документе MongoDB могут быть проиндексированы (индексы в MongoDB концептуально схожи с RDBMSes). Вторичные индексы также доступны.

Рисунок 1 - Самовосстановление наборов репликации MongoDB для обеспечения высокой доступности

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

Балансировка нагрузки
MongoDB для балансировки нагрузки использует приём шардинга. Пользователь выбирает ключ осколка, который определяет, как данные в коллекции будет распространяться. Данные разделены на диапазоны (на основе ключа шарда) и распределены по нескольким осколков. (Осколок мастер с одним или несколькими рабами.) MongoDB может работать на нескольких серверах, балансировка нагрузки и/или дублирования данных, чтобы сохранить систему и работает в случае выхода из строя оборудования. Автоматическая конфигурация легко развернуть и новые машины могут быть добавлены к работающей базе данных.

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

Эта функция, называемая сетевая файловая система, входит с драйверами MongoDB и доступна для языков программирования (см "Языковая поддержка" для списка поддерживаемых языков). MongoDB предоставляет функции для работы с файлами и содержания для разработчиков. GridFS используется, например, в плагинах для NGINX и Lighttpd. Вместо того чтобы хранить файл в одном документе, GridFS делит файл на части, или куски, и в магазинах каждый из этих кусков в качестве отдельного документа.

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

Агрегирование
MapReduce может быть использован для пакетной обработки данных и операциями агрегирования. Рамки агрегации позволяет пользователям получить вид результатов, для которых SQL GROUP BY статьи используется.

Серверный выполнение JavaScript
JavaScript может быть использован в запросах, агрегация функции (такие как MapReduce), и направлено напрямую в базу данных, которая будет выполнена.

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

Архитектура

Модель данных

Данных в качестве документов
MongoDB хранит данные как документы в двоичном представлении под названием BSON (Binary JSON). Кодирование BSON расширяет популярным JSON (JavaScript Object Notation) представление, чтобы включить дополнительные типы, такие как Int, длинные, и с плавающей точкой. BSON документы содержат одно или несколько полей, а каждое поле содержит значение определенного типа данных, в том числе массивов, бинарных данных и судокументов.

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

Рассмотрим, например, модель данных для приложения блогов (рисунок 2). В реляционной базе данных данные модели будет включать несколько таблиц. Для упрощения примера предположим, есть столы для категории, теги, пользователей, Комментарии и статьи.

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

Рисунок 2 - Пример реляционной модели данных для приложения ведения блога

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

Кроме того, документы MongoDB BSON более тесно связаны со структурой объектов в языке программирования. Это делает его проще и быстрее для разработчиков смоделировать, как данные в приложении будут отображаться в данных, хранимых в базе данных.

Динамический схемы
документы MongoDB может варьироваться в структуре. Например, все документы, которые описывают пользователей может содержать идентификатор пользователя и дату последнего они вошли в систему, но только некоторые из этих документов могут содержать идентификатор пользователя для одного или нескольких сторонних приложений. Поля могут варьироваться от документа к документу; нет необходимости декларировать структуру документов в системе - документы самостоятельно, описывающий. Если новое поле должно быть добавлено к документу, то поле может быть создано без влияния все другие документы в системе, не обновляя каталог центральную систему, и без перевода системы в автономном режиме.

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

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

Модель запросов

Идиоматические Драйверы
MongoDB обеспечивает родные драйверы для всех популярных языков программирования и структуры, чтобы сделать развитие естественно. Поддерживаемые драйверы включают в себя Java, .NET, Ruby, PHP, JavaScript, Python Node.js,, Perl, PHP, Scala и др. Драйверы MongoDB предназначены для идиоматических для данного языка.

Одно из фундаментальных различий по сравнению с реляционных баз данных является то, что модель запроса MongoDB реализован как методов или функций в API конкретного языка программирования, в отличие от совершенно отдельный языке, как SQL. Это, в сочетании с близостью между JSON модели документа MongoDB и структур данных, используемых в объектно-ориентированного программирования, делает интеграцию с приложениями простых. Для получения полного списка драйверов посетите страницу MongoDB Драйверы.

Монго оболочки
Оболочки Монго является богатым, интерактивная оболочка JavaScript, что входит в состав всех дистрибутивов MongoDB. Почти все команды, поддерживаемые MongoDB может быть выдан через оболочку, в том числе административных операций. Оболочка Монго является популярным способом взаимодействовать с MongoDB для специальных операций. Все примеры в Руководстве по MongoDB на основе скорлупы. Для более на корпусе Монго, увидеть соответствующую страницу в руководстве MongoDB.

Типы Запроса
В отличие от баз данных NoSQL, MongoDB не ограничивается простыми операциями ключ-значение. Разработчики могут создавать приложения, используя богатые сложные запросы и вторичные индексы, которые разблокировать значение в структурированных, полу-структурированных и неструктурированных данных.

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

  • Запросы ключ-значение Результаты возврат основанные на любом поле InThe документа, часто первичный ключ.
  • Множество запросов Результаты, основанные на определенных значений в виде неравенств (например, больше, меньше или равно, между ними).
  • Геопространственные запросы Показывать результаты, основанные на критериях приближения, пересечения и включения в указанный точке, линии, окружности или многоугольника.
  • Поиск текста запросы возвращают результаты в порядке релевантности, основанные на текстовых аргументов, используя логические операторы (например, И, ИЛИ, НЕ).
  • Запросы агрегации вернуться скопления значений, возвращаемых запросом (например, рассчитывать, мин, макс, средний, похожий на SQL GROUP BY заявление).
  • 'Уменьшение количества запросов' Выполнить сложную обработку данных, выражается в JavaScript и выполнен по данным в базе данных.

Индексирование
Индексы решающим механизмом для оптимизации производительности и масштабируемости системы, обеспечивая гибкий доступ к данным. Как и большинство систем управления базами данных, в то время как индексы улучшит производительность некоторых операций на несколько порядков, они берут на себя нагрузку, связанные в операциях записи, использование дискового пространства, и потребление памяти. По умолчанию, механизм хранения WiredTiger сжимает индексы в памяти, освобождая больше рабочего набора документов (рисунок 3).

Рисунок 3 - Представление данных в форме документов

MongoDB включает в себя поддержку многих видов вторичных индексов, которые могут быть объявлены на любом поле в документе, в том числе полей в массивы:

  • Уникальная Индексы., Указав индекс уникальным, MongoDB будет отвергать вставки новых документов или обновления документа с существующей значение для области, для которых уникальный индекс был создан. По умолчанию все индексы не установлены как уникальный. Если составной индекс определен как уникальный, комбинация значений должно быть уникальным.
  • Составные индексы. Это может быть полезно для создания составных индексов для запросов, которые определяют несколько предикатов Например, рассмотрим приложение, которое хранит данные о клиентах. Приложение может понадобиться, чтобы найти клиентов на основе фамилии, имени и города проживания. С индексом соединения на фамилию, имя и город проживания, запросы могут эффективно найти людей со всеми тремя из этих заданных значений. Дополнительным преимуществом индекса соединения является то, что любой лидер поле в индексе может быть использован, sofewer индексы на отдельных полях могут быть необходимы: этот показатель соединение также оптимизировать запросы ищут клиентов по фамилии.
  • Массива индексов. Для полей, содержащих массив, каждое значение массива хранится в отдельной записи индекса. Например, документы, которые описывают продукты могут включать в себя поле для компонентов. Если есть индекс на поле компонента, каждый компонент индексируется и запросы на поле компонента могут быть оптимизированы по этому показателю. Там нет специального синтаксиса, необходимая для создания индексы массива - если поле содержит массив, она будет индексироваться как индекс массива.
  • TTL индексов. В некоторых случаях данные должны истекают из системы автоматически. Время жизни (TTL) показатели позволяют пользователю задать период времени, после которого данные будут автоматически удалены из базы данных. Обычное использование TTL индексов приложения, которые поддерживают качению окно истории (например, большинство последних 100 дней) для действий пользователя, таких как маршрут передвижения.
  • Геопространственные Индексы. MongoDB обеспечивает геопространственных индексы для оптимизации запросов, связанных с места в двумерном пространстве, например, проекционных систем для земли. Эти показатели позволяют MongoDB для оптимизации запросов к документам, которые содержат точек или полигон, которые находятся ближе к заданной точке или линии; что находятся в круг, прямоугольник, или многоугольника или, что пересекаются с окружностью, прямоугольником или полигоном.
  • Редкие Индексы. Редкие индексы содержат только записи для документов, содержащих указанное поле. Поскольку модель данных документ MongoDB обеспечивает гибкость в модели данных из документа в документ, он является общим для некоторых полей, чтобы присутствовать только в подгруппе всех документов. Редкие показатели позволяют для небольших, более эффективных показателей, когда поля не присутствует во всех документах.
  • Text Search индексов. MongoDB предоставляет специализированный индекс для поиска текста, который использует передовые, конкретного языка лингвистические правила морфологии, токенизации и остановить слова. Запросы, использующие индекс текстового поиска будет возвращать документы в порядке релевантности. Одно или несколько полей могут быть включены в индекс текста.

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

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

Покрытые Запросы
Запросы, которые возвращают результаты, содержащие только индексированные поля называются покрытые запросы. Эти результаты могут быть возвращены, не читая из исходных документов. С соответствующими индексами, нагрузки могут быть оптимизированы для использования преимущественно покрытые запросов.

Управление данными

Авто-шардинг
MongoDB обеспечивает горизонтальное масштабирование аут для баз данных по низкой стоимости, товар аппаратного или облачной инфраструктуры, используя технику под названием Sharding, который является прозрачным для приложений. Шардинг распределяет данные между несколькими физическими разделов, называемых осколками. Шардинг позволяет развертывание MongoDB для решения аппаратных ограничений одном сервере, например, узкие места в ОЗУ или дискового ввода / вывода, без добавления сложности в применении. MongoDB автоматически балансирует данные в sharded кластера, так как данные растет или размер кластера увеличивается или уменьшается.

В отличие от реляционных баз данных, Sharding является автоматическим и встроенным в базу данных. Разработчики не сталкиваются сложность построения логики Sharding в их коде приложения, которые затем должен быть обновлен осколки будут перенесены. Операции команды не нужно развернуть дополнительное программное обеспечение кластеризации для управления процессов и данных распределения.

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

  • Диапазон основе Шардинг. Документы распределена по осколками в соответствии с значением ключа шарда. Документы с шарда ключевых ценностей "близких" друг с другом, вероятно, будут совмещены на одном осколке. Этот подход хорошо подходит для приложений, которые нуждаются в оптимизации rangebased запросов.
  • На основе хэш-Шардинг. Документы равномерно распределена по MD5 хеш значением ключа шарда. Документы с шарда ключевых ценностей "Закрыть" друг с другом, вряд ли будут совмещены на одном осколке. Этот подход гарантирует равномерное распределение по всей записи осколками, но менее оптимальным для запросов по диапазону основе.
  • На расположение Шардинг. Документы разделена в соответствии с указанной пользователем конфигурации, которая связывает осколок диапазоны ключей с конкретными осколками и аппаратного обеспечения. Пользователи могут непрерывно совершенствовать физическое местоположение документов для требований приложения, такие как данные обнаружения в конкретных центрах обработки данных или на хранении с разными температурными (т.е. накопителей для самых последних данных, и жесткие диски для старых данных).

Маршрутизатор запрсов
Маршрутизатор запросов является прозрачным для приложений; есть ли один или сто осколки, код приложения для запроса MongoDB то же самое. Приложения выполнять запросы к маршрутизатору запроса, отправляет запрос в соответствующие осколками.

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

Базовые операции в MongoDB

Проверка установленной версии MongoDB

   
$ mongo --version
  MongoDB shell version: 2.6.4
$

Подключиться к базе данных из оболочки

   
$ mongo
  MongoDB shell version: 2.6.4
  connecting to: test
  >

По умолчанию, Монго выглядит для сервера базы данных на порту 27017 на сервере LOCALHOST. Мы можем изменить эти настройки с помощью -host и -port варианты.

Прерывание соединения

  > ^C
  bye
$

или:

  > exit
  bye
$

или с использованием команды kill:

$ kill 4599

Выключить базу данных
Завершить процесс:

$ ps -ef | grep mongo
  mongodb 1339 1 0 16:23 ? 00:00:18 /usr/bin/mongod --config /etc/mongod.conf
$ kill 1339

Мы должны быть осторожны при использовании убийство -9 <pid>, эта команда вызовет резкое падение базы данных, и это может привести к несогласованности и потере данных.

Обращение к списку созданных баз данных

    > show dbs
    admin (empty)
    local 0.078GB
    test 3.952GB
    >

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

    > db.teams.insert( { teamName : "Boca Juniors" } )
    WriteResult({ "nInserted" : 1 })
    > show dbs
    admin   (empty)
    dbtest  0.078GB
    local   0.078GB
    test    3.952GB
    >

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

MongoDB создает набор файлов в базе данных. Эти файлы хранятся в каталоге мы указали, когда мы начали службу mongod или, по умолчанию, в каталоге /var/lib/mongodb/.

Удалить базу данных

С помощью команды dropDatabase () мы удалим базу данных всю текущую, включая метаданные, а также физические файлы. К "db" объект будет по-прежнему указывает на ту же базу данных.

    > db
    dbtest
    > db.dropDatabase()
    { "dropped" : "dbtest", "ok" : 1 }
    > show dbs
    admin   (empty)
    local   0.078GB
    test    3.952GB
    > db
    dbtest
    >

MongoDB Drupal 8

Для установки использовалась ОС Ubuntu 14.04

$ sudo apt-get update 
$ sudo -s
# apt-get install apache2 -y
# apt-get install mysql-server php5-mysql
# mysql_install_db
# apt-get install php5 libapache2-mod-php5 php5-mcrypt php-dev
# nano /etc/apache2/apache.conf
# service apache2 restart
# mysql -u root -p
# CREATE DATABASE drupal;
# exit
# apt-get install php5-gd php5-curl libssh2-php php-pear
# nano /etc/php5/apache2/php.ini
# a2enmod rewrite
# nano /etc/apache2/sites-enabled/000-default.conf
# service apache2 restart
# cd ~
# wget http://ftp.drupal.org/files/projects/drupal-8.2.3.tar.gz
# tar xzvf drupal*
# cd drupal*
# rsync -avz . /var/www/html
# cd /var/www/html
# mkdir /var/www/html/sites/default/files
# cp /var/www/html/sites/default/default.settings.php /var/www/html/sites/default/settings.php
# chmod 777 /var/www/html/sites/default/settings.php
# chown -R :www-data /var/www/html/*
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
# echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
# apt-get update
# apt-get install -y mongodb-org
# mkdir /data/db
# chown mongodb:mongodb /data/db
# chmod 777 /data/db
# pecl install mongo
# apt-get install build-essential
# nano /etc/php5/apache2/php.ini
# etc/init.d/apache2 restart
# wget https://ftp.drupal.org/files/projects/mongodb-8.x-1.x.dev.tar.gz
# tar -xf ~/mongodb-8.x-1.x.dev.tar.gz
# /etc/init.d/apache2 restart

MongoDB C# ORM

Для MongoDB существует драйвер MongoDB C#, который позволяет написать свою ORM-ку. Рассмотрим работу с mongo с помощью ORM в среде .net.

Что потребуется:

  1. Скачайте (http://www.mongodb.org/downloads), распакуйте и запустите mongod (это сервер)
  2. Драйвер (https://github.com/mongodb/mongo-csharp-driver/downloads), необходимо dll-ки подключить к проекту.
  3. Поехали

Создание базы данных.

По умолчанию база данных находится в папке c:/data/db Запустим mongo.exe и создадим новую базу данных:

$ use mongoblog

Особенностью MongoDb является то, что это документо-ориентированная база данных, и не содержит информацию о структуре, так что тут мы закончили. Сразу переходим к описанию моделей данных.

У нас будет одна сущность (коллекция) unicorns.

public partial class unicorns
{           
    [BsonId]
    public ObjectId Id { get; set; } //указывает что это свойство - id поле объекта 
    public string name { get; set; }
    public string gender { get; set; }
    public DateTime dob { get; set; }
    public List<string> loves { get; set; }
    public int weight { get; set; }
    public int vampires { get; set; }
    public unicorns(string Name, string Gender, DateTime Dob, List<string> Loves, int Weight, int Vampires) { name = Name; gender = Gender; dob = Dob; loves = Loves; weight = Weight; vampires = Vampires; }
}

Далее рассмотрим работу с MongoDB:

  1. подключение к Mongo
  2. добавление записи
  3. изменение записи
  4. индексация
  5. удаление записи
  6. вывод записей (фильтрация/пейджинг/сортировка)
  7. поиск
  8. бекап базы


Подключение к базе

По умолчанию база занимает порт 27017 на сервере (у нас как обычно localhost). Подключаемся к базе:

var ConnectionString = "mongodb://localhost:27017";
string User = "user", Pwd = "pwd", Database = "mongoblog";
var client = new MongoClient(ConnectionString);
MongoServer server = client.GetServer();
MongoCredentials credentials = new MongoCredentials(User, Pwd);  // если вы используете db.mongoblog.auth(...);
MongoDatabase database = server.GetDatabase(Database);

Добавление/изменение записи

//Для добавления объекта в коллекцию необходимо получить коллекцию по имени 
string nameCollection = "unicorns";
var collection = database.GetCollection<unicorns>(nameCollection);            
unicorns obj = new unicorns("Aurora", "f", new DateTime(2015, 7, 20), new List<string>(), 450, 43);
//Для добавления можно выполнить команду:
collection.Insert<unicorns>(obj);
//или (как и для изменения)
collection.Save<unicorns>(obj);

MongoDb самостоятельно добавляет поле _id — уникальный параметр. Если при выполнении команды Save у объекта будет Id существующий уже в коллекции, то выполнится апдейт этого объекта.

Индексация

Для быстрого поиска мы можем добавить индекс по какому-либо полю. Для индексации используется команда

collection.EnsureIndex(IndexKeys.Descending("weight"));

Это ускорит сортировку по этому полю.

Удаление

Для удаления по id создается запрос (Query). В данном случае это

var query = Query.EQ("_id", id)

и выполняется команда:

collection.Remove(query);

Вывод записей

Для вывода значений применив фильтр и отсортированных, да еще и с пейджингом используется курсор. Например чтобы выбрать из коллекции неудаленные (IsDeleted = false) отсортированные по дате убывания (AddedDate desc) 10ю страницу (пропускаем 90 элементов и выводим 10 следующих) составляется такой курсор:

var fields = collection.Find(Query.EQ("weight", 600));
foreach (var obje in fields)
{
    Console.WriteLine("{0}", obje);
}

Поиск

Для того чтобы найти элемент содержащий заданную подстроку необходимо задать следующий запрос:

Console.WriteLine("{0}", collection.Find(Query.Matches("name", "Hor")));

Есть 2 проблемы так как поиск учитывает регистр, т.е. Петя != петя, и к тому же у нас есть много полей.

Бекап базы

Именно бекап а не репликация. Для того чтобы иметь доступ к файлу базы данных нужно выполнить lock (база продолжит работать, только в этот момент все команды записи будут кешироваться, чтобы потом выполнится). После чего базу данных можно скопировать, заархивировать и выложить на ftp. После этой процедуры базу надо разлочить (Unlock). Команды:

public void Lock()
{
    var command = new CommandDocument();
    command.Add("fsync", 1);
    command.Add("lock", 1);
    var collectiono = database.RunCommand(command);
}

public void Unlock()
{
    collectiono = database.RunCommand("$cmd.sys.unlock");
    collection.FindOne();
}

Если что-то пойдет не так, то сервер БД надо будет перезапустить с командой:

$ mongod --repair

Полное видео установки

Установка Mongo DB в Ubuntu Server 16.04

Шаг 1 - Добавление репозитория MongoDB

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

Ubuntu проверяет подлинность пакетов путём проверки подписей GPG ключей, поэтому сначала нам необходимо импортировать ключ официального репозитория MongoDB.

 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927

После успешного импорта ключа вы увидите следующий вывод:

Вывод
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

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

Для этого выполните следующую команду:

echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list

После добавления репозитория нам необходимо обновить список пакетов.

sudo apt-get update

Шаг 2 - Установка MongoDB

Теперь мы можем установить пакеты MongoDB.

sudo apt-get install -y mongodb-org

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

Для того, чтобы запускать MongoDB в виде сервиса Ubuntu 16.04, нам необходимо создать юнит-файл описывающий этот сервис. Юнит-файлы сообщают systemd, как управлять соответствующими ресурсами. Наиболее часто встречающимся типом юнит-файла является сервис, который указывает, как запускать и останавливать тот или иной сервис. Также этот файл указывает, надо ли запускать соответствующий сервис при старте системы, а также, имеет ли сервис зависимости от другого программного обеспечения.

Мы создадим юнит-файл для управления сервисом MongoDB. Создайте файл конфигурации mongodb.service в директории /etc/systemd/system с помощью nano или любого другого текстового редактора.

 sudo nano /etc/systemd/system/mongodb.service

Вставьте следующий текст в этот файл, сохраните и закройте его.

/etc/systemd/system/mongodb.service
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

Этот файл имеет простую структуру:

Секция Unit описание сервиса MongoDB, а также его зависимостей, которые должны быть удовлетворены до запуска сервиса. В нашем случае MongoDB требует наличия сетевого подключения для запуска, поэтому мы указали директиву network.target.

Секция Service описывает параметры запуска сервиса. Директива User указывает, что сервис будет запущен от имени пользователя mongodb, а директива ExecStart задаёт команду запуска сервера MongoDB.

Последняя секция Install сообщает systemd, когда необходимо автоматически запускать сервис. Параметр multi-user.target задаёт стандартную последовательность запуска, что означает, что сервер будет автоматически запущен в процессе загрузки.

Далее запустим только что созданный нами сервис с помощью systemctl.

sudo systemctl start mongodb

Эта команда не выводит ничего в консоль после завершения. Мы можем использовать systemctl для проверки успешного запуска сервиса.

sudo systemctl status mongodb

Вывод

● mongodb.service - High-performance, schema-free document-oriented database
   Loaded: loaded (/etc/systemd/system/mongodb.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2016-04-25 14:57:20 EDT; 1min 30s ago
 Main PID: 4093 (mongod)
    Tasks: 16 (limit: 512)
   Memory: 47.1M
      CPU: 1.224s
   CGroup: /system.slice/mongodb.service
           └─4093 /usr/bin/mongod --quiet --config /etc/mongod.conf

Последнее, что нам осталось сделать, это включить автоматический запуск MongoDB при старте системы.

 sudo systemctl enable mongodb

Репликации MongoDB

Репликация — механизм синхронизации содержимого базы данных с несколькими серверами (репликами). Если один сервер упадет, другой сможет продолжить раздавать и принимать данные (рисунок 4).

Рисунок 4 - Механизм репликации

В MongoDB репликация асинхронная. Это значит, что данные синхронизируются между репликами не в момент непосредственного изменения данных, а через какое-то время. В этом есть плюс: не тратится время на репликацию в момент изменения данных. Минус: в определенные моменты времени данные между репликами могут быть не согласованными. На данный момент MongoDB поддерживает две основные репликации: master-slave и replica sets.

Master-Slave

Рисунок 5 - Модель взаимодействия Master-Slave

Master-Slave применяется во многих СУБД, его модель изображена на рисунке 5. Есть несколько серверов: один мастер, и два слейва. Удалить и писать в базу можно только в мастер-сервере, а читать как из мастера так и из слейвов. Слейвов может быть несколько. Такая схема полезна, когда у нашей системы много запросов на получение данных. Так как приложение может обращаться к слейвам для чтения, то мы можем равномерно распределить нагрузку между ними.

Реализация master-slave в MongoDB. Допустим у нас три машины: 127.0.0.1 будет мастером, а 127.0.0.2 и 127.0.0.3 соответственно слейвами. Для начала запустим mongod в режиме мастера:

 127.0.0.1 $bin/mongod --master</cosole> и другие настройки

Теперь на нашей первой машине крутится мастер, к которому можно обращаться для записи/чтения уже сейчас. Теперь на двух других серверах запустим mongod в режиме слейвов:

<console>127.0.0.2 $bin/mongod --slave --source 127.0.0.1:порт и другие настройки
127.0.0.3 $bin/mongod --slave --source 127.0.0.1:порт и другие настройки

Cлейвы знают, где находится мастер (параметр source ). Если в мастер-сервер кто-то что-то писал или удалял пока осуществлялась настройка слейва, то слейвы автоматически и асинхронно синхронизируются с мастером, и у них будет свежая копия данных.

Когда запускается мастер-сервер, он создает в своей базе коллекцию local.oplog.$main (лог операций). В этой коллекции хранятся все последние операции (изменения данных), которые применялись на мастере. Именно из этой коллекции по слейвам расходятся команды обновления их локальных копий. Размер лога операций ограничен ( можно задать самим). В случае, если лог будет заполнен полностью, более старые операции будут удаляться из него, а новые соответственно добавляться.

Replica Sets

В наборе реплик также присутствует мастер, и при том только один в каждый момент времени. Отличие же в автоматической смене мастера в случае если это необходимо (например, если прежний мастер упадет). Создается несколько процессов mongod с ключом --replSet и указанием имени набора.

 127.0.0.1 $bin/mongod --replSet r1 и другие настройки 
 127.0.0.2 $bin/mongod --replSet r1 и другие настройки 
 127.0.0.3 $bin/mongod --replSet r1 и другие настройки 


Затем серверы реплик необходимо инициализировать. В это время реплики решат между собой, кто будет выполнять функции мастера.

 >config = {_id: 'r1', members: [
{_id: 0, host: '127.0.0.1:27017'},
{_id: 1, host: '127.0.0.2:27017'},
{_id: 2, host: '127.0.0.3:27017'}]
}
> rs.initiate(config);

После запуска серверов и их инициализации можно приступать к изменению данных на мастере и чтению с него. Чтение как и запись возможны только с мастера.

В наборе реплик в случае падения мастера, оставшиеся сервера реплик автоматически решают кто из них станет мастером. Для программы, использующей реплицирование этот процесс прозрачный, так как драйверы MongoDB для всех языков поддерживают указание всех адресов реплик. То есть, программа всегда знает где и сколько реплик и кто из них мастер. Драйверы определяют мастера, и соответственно к нему осуществляют запрос. Это возможно благодаря тому, что каждый реплик-сервер хранит данные и о мастере и о других репликах (для этого существует команда rs.status()).

Успехи и перспективы развития

Примечательно, что MongoDB выиграла бизнес от доходов и сборов Ее Величества - по сути, так называемой IRS Великобритании. «Если бы вы сказали мне шесть месяцев назад, что у нас будет большое государственное учреждение в Великобритании, использующее Atlas, это откровенно удивило бы меня», - сказал генеральный директор Dev Ittycheria во время телефонной конференции компании с аналитиками. MongoDB также процитировал победу с «крупным государственным учреждением» в Италии, а также с Мэрилендской биржей здравоохранения.

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

В прошлом квартале MongoDB заключил партнерское соглашение с SAP, который интегрирует MongoDB с предложениями облачного программного обеспечения SAP. Это партнерство последовало за аналогичным партнерством с IBM и Accenture в начале этого года. Признание, которое демонстрируют эти крупные фирмы, занимающиеся консалтингом и разработкой программного обеспечения, говорит о том, что MongoDB добилась успеха на корпоративном рынке.

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

Заглядывая в будущее, руководство MongoDB намекнуло на большее количество инноваций для крупных предприятий. В частности, руководство заявило, что клиенты заинтересованы в использовании функций всех крупных поставщиков услуг публичного облака. В дополнение к предотвращению блокировки клиентов, руководство объяснило, что многие клиенты хотели воспользоваться различными уникальными функциями, которые предоставляет каждая крупная облачная компания. В этом отношении позиционирование MongoDB «нейтрально к облаку» продолжает оставаться преимуществом, даже несмотря на то, что оно конкурирует с теми же облачными компаниями, которые имеют свои собственные предложения баз данных[Источник 8].

Источники

  1. System Properties Comparison Couchbase vs. MongoDB // Knowledge Base of Relational and NoSQL Database Management Systems. URL: https://db-engines.com/en/system/Couchbase%3BMongoDB (дата обращения: 16.05.2020)
  2. Release Notes for MongoDB 4.2 // mongodb. URL: https://docs.mongodb.com/manual/release-notes/4.2/ (дата обращения: 16.05.2020)
  3. MongoDB r4.2.2-rc1 // mongodb github. URL: https://github.com/mongodb/mongo/releases/tag/r4.2.2-rc1 (дата обращения: 16.05.2020)
  4. How to Set Up a MongoDB NoSQL Cluster Using Oracle Solaris Zones // Oracle. URL: https://www.oracle.com/technical-resources/articles/solaris/sol-howto-mongodb-zones.html (дата обращения: 16.05.2020)
  5. How-To: MongoDB on FreeBSD 10.x // Freebsdnews. URL: https://www.freebsdnews.com/2016/04/01/how-to-mongodb-on-freebsd-10-x/ (дата обращения: 16.05.2020)
  6. 10gen embraces what it created, becomes MongoDB Inc // GIGAOM. URL: https://gigaom.com/2013/08/27/10gen-embraces-what-it-created-becomes-mongodb-inc/ (дата обращения: 16.05.2020)
  7. DB-Engines Ranking // Knowledge Base of Relational and NoSQL Database Management Systems. URL: https://db-engines.com/en/ranking (дата обращения: 16.05.2020)
  8. MongoDB продолжает впечатлять - Инвестирование - 2020 // capitalmediacommunications. URL: https://ru.capitalmediacommunications.com/amazon-beat-its-sales-guidance-over-holidays-2018-342040 (дата обращения: 11.05.2020)

Ссылки