Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Основы MongoDB

Лекция



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

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

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

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

Сравнение и аналогия ,Mysql MongoDB

Основы MongoDB

Установка

Скачать MongoDB можно с официального сайта для Linux, MacOS, Windows.

В Linux это также можно сделать с одной из следующих команд:

apt

sudo apt install -y mongodb

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

После успешной установки MongoDB и Mongoshell мы можем спокойно начать взаимодействовать с базой данных с помощью терминала. Достаточно просто ввести mongosh:

Основы MongoDB

Как мы видим мы находимся в базе данных test, однако на самом деле ее пока что не существует!

Более подробно о том, что будет ниже можно прочитать здесь

Все дело в том, что в mongoDB не существует базы данных, покуда мы в нее что-то не поместим. Также, при обращении к определенным объектам (база данных, коллекция) mongoDB они меняют значение, только если существуют, а если не существуют, то они просто создаются. Давайте продемонстрируем принцип работы:

show dbs

Основы MongoDB

Команда show dbs показывает какие базы данных существуют в данный момент. Как мы видим в списке нет значения test.

Для того чтобы создать новую базу данных (или использовать существующую) мы должны использовать ключевое слово use:

use new_database

Основы MongoDB

Как мы видим мы перешли в базу данных new_database, однако в списке мы ее не наблюдаем (это из-за того правила, что я писал вверху: базы данных не существует, покуда нее что-то не поместить).

Давайте создадим новую коллекцию под названием customers (покупатели) и положим туда значение name: Daniil:

db.customers.insertOne({name: "Daniil"});

Основы MongoDB

Тут мы обратились к базе данных с помощью db, затем мы указали коллекцию через точку и положили туда значение с помощью функции insertOne(). JavaScript является языком запросов MongoDB. Под капотом MongoDB находится MozJs, который является форком SpiderMonkey (Mozilla Firefox).Если вам интересно, вы можете взглянуть на исходный код.

Теперь давайте посмотрим какие коллекции есть в нашей базе данных, но как это сделать? Можно ввести db. и нажать Tab, для того чтобы посмотреть какие свойства и методы есть у нашего объекта db (объектом для легкости понимания можно считать обычный объект из JavaScript, тут даже методы есть похожие: toString, isPrototypeOf, hasOwnProperty)

Основы MongoDB

Далее мы можем посмотреть наши коллекции с помощью специального метода getCollectionNames:

db.getCollectionNames();

Основы MongoDB

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

Есть еще сокращения команд, которые мы тоже можем использовать, например show collections вернет нам то же самое, однако вид будет более читаемый для человека:

show collections

Основы MongoDB

У нашей коллекции, к слову, тоже есть методы и свойства, но они немного другие:

Основы MongoDB

Мы можем использовать коллекцию в связке с find(), для того чтобы вывести все содержимое коллекции:

db.customers.find();

Основы MongoDB

Давайте добавим еще нескольких покупателей с помощью метода insertMany():

db.customers.insertMany([{name: "Jinx"}, {name: "Tony"}, {name: "Alex"}]);

Основы MongoDB

Итак, давайте заметим несколько моментов на скриншоте:

  1. Метод insertMany() принимает массив элементов, а не просто элементы

  2. MongoDB все равно прилегают ли ключи и их значения к скобкам или нет

  3. Синтаксис MongoDB очень похож на синтаксис JavaScript, поэтому мы можем использовать все виды кавычек (двойные, одинарные, обратные).

В ответ данный метод отдал нам объект, в котором есть свойство acknowledged (подробнее читайте тут) и вложенный объект с ключами из массива и соответствующими им id.

Теперь давайте выведем двух пользователей (не важно каких) из нашего списка используем следующую команду db.customers.find().limit(2):

Основы MongoDB

Как мы видим мы вывели всего два объекта из нашей коллекции, однако что еще мы можем делать с "найденными" объектами? А вот что:

Основы MongoDB

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

Теперь давайте рассортируем наши значения с помощью метода sort():

Основы MongoDB

Метод sort() принимает в аргументы объект, где указано по какому значению нужно провести сортировку. Об этом говорит сайт https://intellect.icu . 1 говорит о том, что сортировку нужно произвести в порядке возрастания, -1 же будет производить ее в порядке убывания.

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

db.customers.updateOne({name: "Daniil"}, {$set: {age: 19}});

Основы MongoDB

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

Теперь давайте применим метод updateMany() для того чтобы поменять значения у множества элементов, а затем перейдем к сортировке с двумя аргументами:

db.customers.updateMany({name: {$ne: "Daniil"}}, {$set: {age: 15}});

Основы MongoDB

Появился еще один атомный оператор, который обозначает не равно (ne - not equal). В данном случае запрос звучит так: "Найди мне все записи, где имя не равно 'Daniil', и поставь им значение 'age' в 15". (Для справки: set (англ.) - назначить, поставить)

Теперь рассортируем массив с помощью двух аргументов:

db.customers.find().sort({age: -1, name: -1});

Основы MongoDB

Тут sort() принял аргументом объект с двумя ключами. Сначала он будет сортировать записи по первому ключу, а если найдет повторяющиеся первые ключи, то начнет сортировать по второму ключу. -1 означает обратную сортировку (в порядке убывания).

MongoDB позволяет получить специфические поля из найденных объектов и не показывать другие (нам ненужные поля):

db.customers.find({}, {name: 1, _id: 0});

Основы MongoDB

Здесь мы просто наши все записи с помощью {} (так как определенного идентификатора для нахождения не задано, mongoDB вернул нам все записи), а вторым аргументом передали что именно хотим видеть. 1 тут соответствует выводу, а 0 - наоборот, те данные, которые не будут выводиться.

Также мы можем выводить наши значения и с помощью других методов, однако дочерние методы тоже будут другими:

db.customers.aggregate();
db.customers.aggregate().toArray();

Основы MongoDB

В данном случае мы перевели наш массив данных в обычный массив. Позже мы сможем проводить над ним некие операции.

Более сложные запросы

Атомные операторы нужны для того, чтобы усложнять запросы. Популярные атомные операторы:

  • gt - greater than (больше)

  • lt - less than (меньше)

  • gte и lte - больше или равно и меньше или равно

  • eq - равно

  • ne - не равно

  • in - значение содержится в чем-то

  • nin - значение не содержится в чем-то

  • or - или

  • and - и

  • exists - существует

  • set - изменить или добавить

Некоторые из них мы рассмотрим ниже:

db.customers.find({age: {$gt: 15}});

Основы MongoDB

Как мы видим тут вывелись все записи, у которых поле age больше чем 15.

db.customers.find({name: {$in: ['Daniil', 'Jinx']}});

Основы MongoDB

Тут же вывелись все записи, у которых имя содержится в массиве ['Daniil', 'Jinx'] .

Добавим еще один объект, у которого не будет поля age и проверим работу оператора exists:

db.customers.find({age: {$exists: true}});

Основы MongoDB

Видим, что тут exists отработал верно и запись с name: 'Denis' не вывелась.

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

Все остальные команды по типу:

  • deleteOne (удаляет запись)

  • replaceOne (заменяет запись)

  • updateOne (обновляет запись)

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

Приступим. Запустите сервер 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()

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

Вернемся к обсуждению бесструктурных коллекций. Давайте вставим кардинально отличный от предыдущего документ в 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'], weight: 600, gender: 'm', vampires: 63}); 
db.unicorns.insert({name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}); 
db.unicorns.insert({name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}); 
db.unicorns.insert({name: 'Moons', dob: new Date(1979, 7, 18, 18, 44), loves: ['potato'], weight: 575, gender: 'm', vampires: 99}); 
db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['potato', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); 
db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); 
db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['potato', 'sugar'], weight: 421, gender: 'm', vampires: 2}); 
db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['potato', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); 
db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['potato', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); 
db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); 
db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165}); 

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

db.unicorns.find({gender: 'm', weight: {$gt: 700}}) 

//или (что не полностью эквивалентно, но приведено здесь в демонстрационных целях)

db.unicorns.find({gender: {$ne: 'f'}, weight: {$gte: 701}})

Оператор $exists используется для проверки наличия или отсутствия поля, например:

db.unicorns.find({vampires: {$exists: false}}) 

Вернет единственный документ. Если нужно ИЛИ вместо И, мы можем использовать оператор $or и присвоить ему массив значений, например:

db.unicorns.find({gender: 'f', $or: [{loves: 'potato'}, {loves: 'orange'}, {weight: {$lt: 500}}]}) 

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

В нашем последнем примере произошло кое-что интересное. Вы заметили - поле loves это массив. MongoDB поддерживает массивы как объекты первого класса. Это потрясающе удобная возможность. Начав это использовать, вы удивитесь, как вы раньше жили без этого. Самое интересное это та простота, с которой делается выборка по значению массива: {loves: 'watermelon'} вернет нам все документы, у которых watermelon является одним из значений поля loves.

Это еще не все операторы. Самый гибкий оператор - $where, позволяющий нам передавать JavaScript для его выполнения на сервере. Это описано в разделе Сложные запросы на сайте MongoDB. Мы изучили основы, которые нам нужны для начала работы. Это также то, что вы будете использовать большую часть времени.

Мы видели, как эти селекторы могут быть использованы с командой find. Они также могут быть использованы с командой remove, которую мы кратко рассмотрели, командой count, на которую мы пока не взглянули, но которую вы скорее всего изучите, и командой update, с которой в дальнейшем мы проведем большую часть времени.

ObjectId, сгенерированный MongoDB для поля _id, подставляется в селектор следующим образом:

 db.unicorns.find({_id: ObjectId("TheObjectId")})

В этой главе

Мы пока еще не рассматривали команду update или более интересные вещи, которые можно сделать с помощью find. Однако мы подняли MongoDB, кратко изучили команды insert и remove (изучив практически все, что о них можно изучить). Мы также начали исследовать find и узнали что такое селекторы MongoDB. Это неплохо для начала, и основы для дальнейшего изучения заложены. Верите или нет, но вы уже изучили практически все, что нужно знать о MongoDB - настолько она проста и легка в изучении. Я настоятельно рекомендую вам поэкспериментировать с вашими данными, прежде, чем можно будет двигаться дальше. Вставьте несколько новых документов - возможно в новые коллекции - и поэкспериментируйте с селекторами. Используйте find, count и remove. После нескольких ваших собственных попыток вещи, казавшиеся непонятными, станут на свои места.

Вау!! 😲 Ты еще не читал? Это зря!

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

создано: 2020-12-18
обновлено: 2021-11-22
9



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Базы данных MongoDB

Термины: Базы данных MongoDB