Основы MongoDB за 5 минут

Kate

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

Считается одним из классических примеров NoSQL-систем, использует JSON-подобные документы и схему базы данных. Данную базу данных применяют в веб-разработке, в частности, в рамках JavaScript-ориентированного стека MEAN, MEVN, MERN, которые часто используются веб-разработчиками, как любимые стеки технологий для создания приложений.

Установка​

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

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

apt

sudo apt install -y mongodb
dnf

cat <<EOF | sudo tee /etc/yum.repos.d/mongodb.repo
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF

sudo yum install -y mongodb-org
brew

brew tap mongodb/brew
brew install mongodb-community
Также для того чтобы взаимодействовать с БД нам потребуется шелл (MongoShell), который качается отдельно: https://www.mongodb.com/try/download/shell?jmp=docs

Основы​

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

db15c17693ad48e3dbe0033005d16660.png

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

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

7b8b8411202680c8b2e44c159c66b3b4.png

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

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

614ef2ef960ce5f4aeb7ff0e9d8a47ad.png

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

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

a995f01d64bfce69cea14d58b91060f2.png

Тут мы обратились к базе данных с помощью db, затем мы указали коллекцию через точку и положили туда значение с помощью функции insertOne(). Синтаксис запросов к MongoDB очень напоминает синтаксис JavaScript и это просто отлично, так как вам не придётся учить новый синтаксис, для того чтобы работать с базой данных!

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

fb5c1d468493416b5d2548d29b815a81.png

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

5fd7da953e9f9cfc544ddd2869f5bf01.png

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

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

a500d859ee081378db55117003b5177e.png

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

2e21d1b7a4790556dfb71b77ec5cccec.png

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

ba3759df6f7fee4334ddcf5a716ee590.png

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

77a340edae98e5c1e54e308aa05fda18.png

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

  1. Метод insertMany() принимает массив элементов, а не просто элементы
  2. MongoDB все равно прилегают ли ключи и их значения к скобкам или нет
  3. Синтаксис MongoDB очень похож на синтаксис JavaScript, поэтому мы можем использовать все виды кавычек (двойные, одинарные, обратные).
В ответ данный метод отдал нам объект, в котором есть свойство acknowledged (подробнее читайте тут) и вложенный объект с ключами из массива и соответствующими им id.

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

6fd8f1b8beffdae3d19fdf8ed34535ba.png

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

7f8a73c17e5894811b972b2f874659c2.png

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

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

267426ca0531e57e8343fb39e951c950.png

Метод sort() принимает в аргументы объект, где указано по какому значению нужно провести сортировку. 1 говорит о том, что сортировку нужно произвести в порядке возрастания, -1 же будет производить её в порядке убывания.

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

1d213fac6a2b2b7a086c9a0cbf000f46.png

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

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

62d241115423fb4e1dafba7721946680.png

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

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

ecc4f5fbf1dae777d59efafd7366f3cb.png

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

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

84670d87ef7487a7c69f8da2bf4b1c5a.png

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

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

471558edc17d23c1422ed51be8985ff1.png

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

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

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

  • gt - greater than (больше)
  • lt - less than (меньше)
  • gte и lte - больше или равно и меньше или равно
  • eq - равно
  • ne - не равно
  • in - значение содержится в чем-то
  • nin - значение не содержится в чем-то
  • or - или
  • and - и
  • exists - существует
  • set - изменить или добавить
Некоторые из них мы рассмотрим ниже:

1903243bf0fbff955a47abfdec0e4879.png

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

53877a57659cb26b3e8f24269b16ab38.png

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

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

7a358388dbe0924b53d7ff6d73761303.png

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

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

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

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

 
Сверху