Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Введение в MongoDB

Покупка
Новинка
Артикул: 825624.01.99
Доступ онлайн
1 000 ₽
В корзину
MongoDB система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц. Написана на языке C++.
Сегуин, К. Введение в MongoDB : краткий учебный курс / К. Сегуин. - Москва : ИНТУИТ, 2016. - 36 с. - Текст : электронный. - URL: https://znanium.ru/catalog/product/2138303 (дата обращения: 18.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
К. Сегуин






Введение в MongoDB













            ^ИНТУИТ


  НАЦИОНАЛЬНЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ

                С.ИНТУ ИТ





    У НАЦИОНАЛЬНЫЙ ОТКРЫТЫЙ УНИВЕРСИТЕТ


        Введение в MongoDB

2-е издание, исправленное
Сегуин К.



Национальный Открытый Университет “ИНТУИТ”
2016


2

Введение в MongoDB/ К. Сегуин - М.: Национальный Открытый Университет “ИНТУИТ”, 2016
MongoDB система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц. Написана на языке C++.
(c) ООО “ИНТУИТ.РУ”, 2016-2016
(c) Сегуин К., 2016-2016

3

    Введение

    Лицензия

The Little MongoDB Book (Маленькая книга о MongoDB) распространяется под лицензией Attribution-NonCommercial 3.0 Unported. Вы не должны платить за эту книгу.
Разрешается свободно копировать, распространять, изменять или публиковать данную книгу. Однако, прошу всегда ссылаться на автора - Karl Seguin - и не использовать книгу в коммерческих целях.
Полный текст лицензии всегда можно прочитать здесь:
ссылка: http://creativecommons.org/licenses/by-nc/3.0/legalcode

    Об авторе

Karl Seguin - разработчик с опытом во многих областях и технологиях. Он является .NET- и Ruby-разработчиком с большим опытом работы. Также участвует в open-source проектах, является техническим писателем и нерегулярным докладчиком на конференциях. Применительно к MongoDB, он был разработчиком ядра C# MongoDB библиотеки NoRM, написал интерактивный учебник ссылка: mongly -http://mongly.com/ и ссылка: Mongo Web Admin - https://github.com/karlseguin/Mongo-Web-Admin. Его бесплатный сервис для разработчиков казуальных игр, mogade.com, работает на MongoDB.
Карл также написал книгу ссылка: The Little Redis Book -http://openmymind.net/2012/1/23/The-Little-Redis-Book/
Вот его блог: ссылка: http://openmymind.net, и твиттер: ссылка: http://old.intuit.ru/department/database/intmongodb/1/@karlseguin

    Благодарности

Особая благодарность ссылка: Perry Neal - https://twitter.com/perryneal за ум, внимание и энтузиазм. Ты оказал мне неоценимую помощь. Спасибо.

    Последняя версия

Свежие исходники книги доступны по адресу:
ссылка: http://github.com/karlseguin/the-little-mongodb-book

    О переводе


4

Перевёл на русский язык ссылка: http://old.intuit.ru/department/database/intmongodb/1/@jsmarkus (хабраюзер ссылка: markpnk - https://habrahabr.ru/users/markpnk/).

Корректоры:

  с ссылка: Денис Веселов - https://github.com/saippuakauppias (хабраюзер ссылка: progrik - https://habrahabr.ru/users/progrik/).
  • ссылка: Павел Вирский - https://github.com/Paaashka (хабраюзер ссылка: Paaashka -https://habrahabr.ru/users/Paaashka/)

Не моя вина, что книга такая короткая, просто MongoDB легка в освоении.

Технологии развиваются семимильными шагами. Список новых технологий и методологий постоянно растёт. Однако, я всегда придерживался мнения, что фундаментальные технологии, используемые программистами, развиваются не столь стремительно. Можно долгое время обладать актуальными знаниями, не пополняя их. Однако зачастую устоявшиеся технологии заменяются другими с потрясающей скоростью. Внезапные скачки разработок иногда ставят под угрозу устоявшиеся старые технологии.

Яркий пример того - прогресс NoSQL-технологий, приходящих на замену давно известным реляционным базам данных. Вчера еще веб базировался на нескольких известных СУРБД, однако уже сегодня появилось около пяти NoSQL-решений, достойно зарекомендовших себя.

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

Принимая во внимание всё вышеизложенное, мы должны уяснить, чем же является NoSQL. Это широкий термин, который означает разное для разных людей. Лично я использую его в широком смысле, чтобы обозначить систему, участвующую в хранении данных. С другой стороны NoSQL для меня означает убежденность в том, что задача хранения данных не возлагается на одну большую систему. В то время, как производители большинства баз данных исторически пытались позиционировать свой софт, как решение “всё в одном”, NoSQL стремится к меньшему уровню ответственности - когда для определенных задач может быть выбран такой инструмент, который бы решал именно эту задачу наилучшим образом. К примеру, ваш NoSQL-стек может эффективно использовать реляционные базы данных, как например MySQL, однако он также может включать в себя Redis - для организации хранения записей key-value или Hadoop - для интенсивной обработки данных. Проще говоря, NoSQL - это открытая технология, состоящая из альтернативных,


5

существующих и дополнительных шаблонов управления данными.


Удивительно, но MongoDB подходит под все эти определения. Как документ-ориентированная СУБД, Mongo - это довольно-таки обобщенное NoSQL решение. Ее можно рассматривать, как альтернативу реляционным СУБД. Подобно реляционным СУБД, она также может выигрышно дополняться более специализированными NoSQL решениями. У MongoDB есть как достоинства, так и недостатки, о них мы поговорим в следующих частях книги.

Как вы уже заметили, термины MongoDB и Mongo используются как синонимы.

    Приступая к работе

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

Мы подошли к первому, что надо знать о MongoDB: к её драйверам. У MongoDB есть ссылка: множество официальных драйверов -https://docs.mongodb.org/ecosystem/drivers/ для различных языков. Их можно рассматривать как драйверы уже привычных реляционных БД. На их основе сообщество разработчиков построило множество высокоуровневых драйверов - для определенных языков и фреймворков. Например, ссылка: NoRM -https://github.com/atheken/NoRM это библиотека для C#, реализующая LINQ, а ссылка: MongoMapper - https://github.com/mongomapper/mongomapper для Ruby, с поддержкой ActiveRecord. Программировать напрямую, используя низкоуровневые драйверы MongoDB, или же с применением высокоуровневых библиотек - решайте сами. Я подробно остановился на этом, потому что множество новичков бывают сбиты с толку наличием как официальных драйверов, так и разрабатываемых сообществом - первые нацелены на базовую коммуникацию с Mongo, в то время как вторые - больше на внедрение в конкретные языки и фреймворки.

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

  1. Зайдите на ссылка: официальную страницу скачивания -https://www.mongodb.org/downloads#production и скачайте бинарные файлы из первой строки (рекомендованную стабильную версию) для операционной системы, которую вы используете. Для разработки можно использовать как 32-, так и 64-разрядную версию.
  2. Распакуйте архив (куда угодно) и перейдите в папку bin. Пока ничего не запускайте, но запомните, что mongod - это сервер, а mongo - клиентская консоль -вот два исполняемых файла, с которыми нам чаще всего предстоит работать.
  3. Создайте новый файл в папке bin и назовите его mongodb.config

  4. Добавьте в mongodb.config одну строку:
    dbpath=ПУТЬ_КУДА_ХОТИТЕ_СОХРАНИТЬ_ФАЙЛЫ_БАЗЫ_ДАННЫХ.


6

    Например, в Windows можно написать dbpath=c:\mongodb\data а в Linux -dbpath=/etc/mongodb/data.


  5. Убедитесь, что указанный вами путь dbpath существует.
  6. Запустите mongod с параметром —config /path/to/your/mongodb.config.

Для пользователей Windows, например, если вы распаковали скачанный файл в c:\mongodb\ и создали папку c:\mongodb\data\, то в c:\mongodb\bin\mongodb.config следует указать db?path=c:\mongodb\data\. Теперь можно запускать mongod из командной строки с помощью команды c:\mongodb\bin\mongod —config c:\mongodb\bin\mongodb.config.

Папку bin можно для удобства добавить в переменную окружения PATH. Для пользователей MacOSX и Linux инструкции практически те же самые. Всё, что нужно сделать - это просто изменить пути.

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

Теперь, чтобы подключиться к запущенному серверу, можете запустить mongo (без d в конце). Попробуйте ввести db.version(), чтобы убедиться, что все в порядке. Если всё нормально - вы увидите номер версии вашего сервера.


7

    Основы

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

Для начала нужно понять шесть основных концепций.

  1. MongoDB - концептуально то же самое, что обычная, привычная нам база данных (или в терминологии Oracle - схема). Внутри MongoDB может быть ноль или более баз данных, каждая из которых является контейнером для прочих сущностей.
  2. База данных может иметь ноль или более “коллекций”. Коллекция настолько похожа на традиционную “таблицу”, что можно смело считать их одним и тем же.
  3. Коллекции состоят из нуля или более “документов”. Опять же, документ можно рассматривать как “строку”.
  4. Документ состоит из одного или более “полей”, которые - как можно догадаться -подобны “колонкам”.
  5. “Индексы” в MongoDB почти идентичны таковым в реляционных базах данных.
  6. “Курсоры” отличаются от предыдущих пяти концепций, но они очень важны (хотя порой их обходят вниманием) и заслуживают отдельного обсуждения. Важно понимать, что когда мы запрашиваем у MongoDB какие-либо данные, то она возвращает курсор, с которыми мы можем делать все что угодно - подсчитывать, пропускать определенное число предшествующих записей - при этом не загружая сами данные.

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

Вы можете спросить - зачем придумывать новые термины (коллекция вместо таблицы, документ вместо записи и поле вместо колонки)? Не излишнее ли это усложнение? Ответ в том, что эти термины, хоть и близки своим “реляционным” аналогам, но не полностью идентичны им. Основное различие в том, что реляционные базы данных определяют “колонки” на уровне “таблицы”, в то время как документ-ориентированные базы данных определяют “поля” на уровне “документа”. Это значит, что любой документ внутри коллекции может иметь свой собственный уникальный набор полей. В этом смысле коллекция “глупее” чем таблица, тогда как документ имеет намного больше информации, чем строка.

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


8

Приступим. Запустите сервер mongod и консоль mongo, если еще не запустили. Консоль работает на JavaScript. Есть несколько глобальных команд, например help или exit. Команды, которые вы запускаете применительно к текущей базе данных исполняются у объекта db, например db.help() или db.stats(). Команды, которые вы запускаете применительно к конкретной коллекции, исполняются у объекта db. имя_коллекции, например db.unicorns.help() или db.unicorns.count().

Введите db.help() и получите список команд, которые можно выполнить у объекта db. Заметка на полях. Поскольку консоль интерпретирует JavaScript, если вы попытаетесь выполнить метод без скобок, то в ответ получите тело метода, но он не выполнится. Не удивляйтесь, увидев function (...){, если случайно сделаете так. Например, если введёте db.help (без скобок), вы увидите внутренне представление метода help.

Сперва для выбора базы данных воспользуемся глобальным методом use - введите use learn. Неважно, что база данных пока еще не существует. В момент создания первой коллекции создастся база данных learn. Теперь, когда вы внутри базы данных, можно вызывать у неё команды, например db.getCollectionNames(). В ответ увидите пустой массив ([ ]). Поскольку коллекции бесструктурны (в оригинале “schema-less”. Здесь и далее - прим. перев.), мы не обязаны создавать их явно. Мы просто можем вставить документ в новую коллекцию. Чтобы это сделать, используйте команду insert, передав ей вставляемый документ:

 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})

Данная строка выполняет метод insert (“вставить”) в коллекцию unicorns, передавая ему единственный аргумент. MongoDB у себя внутри использует бинарный сериализированный JSON формат. Снаружи это означает, что мы широко используем JSON, как, например, в случае с нашими параметрами. Если теперь выполнить db.getCollectionNames(), мы увидим две коллекции: unicorns и system.indexes. system.indexes создается в каждой базе данных и содержит в себе информацию об индексах этой базы.

Теперь у коллекции unicorns можно вызвать метод find, который вернет список документов:

 db.unicorns.find()

Заметьте, что кроме данных, которые мы задавали, появилось дополнительное поле _id. Каждый документ должен иметь уникальное поле _id. Можете генерировать его сами или позволить MongoDB самой сгенерировать для вас ObjectId. В большинстве случаев вы скорее всего возложите эту задачу на MongoDB. По умолчанию _id -индексируемое поле, вследствие чего и создается коллекция system.indexes. Давайте взглянем на system.indexes:

 db.system.indexes.find()

Вы увидите имя индекса, базы данных и коллекции, для которой индекс был создан, а


9

также полей, которые включены в него.

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

 db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false})

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

    Осваиваем селекторы

В дополнение к изученным ранее шести концепциям, есть еще один немаловажный практический аспект MongoDB, который следует освоить, прежде чем переходить к более сложным темам: это - селекторы запросов. Селектор запросов MongoDB аналогичен предложению where SQL-запроса. Как таковой он используется для поиска, подсчёта, обновления и удаления документов из коллекций. Селектор - это JSON-объект, в простейшем случае это может быть даже {}, что означает выборку всех документов (аналогичным образом работает null). Если нам нужно выбрать всех единорогов (англ. “unicorns”) женского рода, можно воспользоваться селектором {gender:‘f’}.

Прежде, чем мы глубоко погрузимся в селекторы, давайте сначала создадим немного данных, с которыми будем экспериментировать. Сперва давайте удалим всё, что до этого вставляли в коллекцию unicorns с помощью команды: db.unicorns.remove() (поскольку мы не передали селектора, произойдет удаление всех документов). Теперь давайте произведем следующие вставки, чтобы получить данные для дальнейших экспериментов (можете скопировать и вставить это в консоль):

 db.unicorns.insert({name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], db.unicorns.insert({name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape' db.unicorns.insert({name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 're db.unicorns.insert({name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'] db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'c db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'] db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermel db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carr db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'waterm

Теперь, когда данные созданы, можно приступать к освоению селекторов. {поле: значение} используется для поиска всех документов, у которых поле равно значение. {поле1: значение1, поле2: значение2} работает как логическое И. Специальные операторы $lt, $lte, $gt, $gte и $ne используются для выражения операций “меньше”,


10

Доступ онлайн
1 000 ₽
В корзину