MongoDB — это программа с открытым исходным кодом, ориентированная на документы, база данных NoSQL. Если вы давно работаете с традиционными реляционными базами данных, идея документно-ориентированной базы данных NoSQL действительно может показаться странной. «Как может база данных не иметь таблиц?», Спросите вы. Это руководство знакомит вас с некоторыми основными понятиями MongoDB и должно помочь вам начать работу, даже если у вас очень ограниченный опыт работы с системой управления базами данных.
Что такое MongoDB?
Вот что официальная документация говорит о MongoDB.
MongoDB — это база данных с открытым исходным кодом, разработанная MongoDB Inc., которая масштабируема и гибка. MongoDB хранит данные в JSON-подобных документах, которые могут различаться по структуре.
Очевидно, MongoDB является системой баз данных. Но зачем нам нужен другой вариант базы данных, когда существующие решения недорогие и успешные? В системе реляционной базы данных, такой как MySQL или Oracle, есть таблицы, и в каждой таблице есть ряд строк и столбцов. MongoDB, являющаяся системой баз данных, ориентированной на документы, не имеет их. Вместо этого он имеет JSON-подобную структуру документа, которая является гибкой и простой в работе. Вот пример того, как выглядит документ MongoDB:
{ "_id": ObjectId(3da252d3902a), "type": "Article", "title": "MongoDB Tutorial Part One", "description": "First document", "author": "Manjunath", "content": "This is an..." } { "_id": ObjectId(8da21ea3902a), "type": "Article", "title": "MongoDB Tutorial Part Two", "description": "Second document", "author": "Manjunath", "content": "In the second..." }
Документ в базе данных NoSQL соответствует строке в базе данных SQL. Группа документов вместе называется коллекцией , которая примерно синонимична таблице в реляционной базе данных. Подробный обзор баз данных NoSQL и SQL и их различий мы рассмотрели в учебнике SQL vs NoSQL .
Помимо базы данных NoSQL, у MongoDB есть несколько собственных качеств. Я перечислил некоторые из его основных функций ниже:
- это легко установить и настроить
- он использует BSON (JSON-подобный формат) для хранения данных
- легко сопоставить объекты документа с кодом вашего приложения
- он претендует на высокую масштабируемость и доступность, а также поддерживает готовую репликацию
- он поддерживает операции MapReduce для сжатия большого объема данных в полезные агрегированные результаты
- это бесплатно и с открытым исходным кодом.
MongoDB, кажется, преодолевает ограничения старых реляционных баз данных и баз данных NoSQL. Если вы еще не уверены, почему это полезно, ознакомьтесь с нашей статьей « Выбор между NoSQL и SQL» .
Давайте продолжим и установим MongoDB.
Установка MongoDB
Установка MongoDB проста и не требует большой настройки или настройки. MongoDB поддерживается всеми основными платформами и дистрибутивами, и вы можете проверить их документацию, если сомневаетесь.
Ниже приведены инструкции по установке MongoDB на macOS.
Для Linux MongoDB рекомендует устанавливать программное обеспечение с помощью менеджера пакетов вашего дистрибутива . Если вы используете Windows, это так же просто, как загрузить последнюю версию с веб-сайта MongoDB и запустить интерактивный установщик.
Установка MongoDB на macOS с помощью Homebrew
Homebrew — менеджер пакетов для macOS, и в этом руководстве предполагается, что вы уже установили Homebrew на свой компьютер.
- Откройте приложение терминала и запустите
$ brew update
- После обновления brew установите пакет mongodb следующим образом
$ brew install mongodb
-
Создайте каталог данных, чтобы процесс
mongod
мог записывать данные. По умолчанию каталогом является/data/db
:```bash $ mkdir -p /data/db ```
-
Убедитесь, что у вашей учетной записи есть разрешение на чтение и запись данных в этот каталог:
```bash $ sudo chown -R `id -un` /data/db > # Enter your password ```
-
Инициируйте сервер Монго. Запустите команду
mongod
чтобы запустить сервер. -
Запустите оболочку Монго. Откройте другое окно терминала и запустите
mongo
. Оболочка Монго попытается подключиться к демону Монго, который мы инициировали ранее. После успешного подключения вы можете использовать оболочку в качестве игровой площадки для безопасного выполнения всех ваших команд. -
Выйдите из оболочки Mongo, запустив
quit()
и демон mongo, нажав control + C.
Теперь, когда у нас есть демон mongo, давайте познакомимся с основами MongoDB.
Основные операции с базой данных
Войдите в оболочку Mongo, если вы еще этого не сделали:
[mj@localhost ~]$ mongo MongoDB shell version v3.6.1 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.1 connecting to: test
Вы можете увидеть мою версию оболочки MongoDB при входе в систему. По умолчанию вы подключены к тестовой базе данных. Вы можете проверить имя текущей базы данных, запустив db
:
> db test
Это круто, но что, если мы хотим новую базу данных? Для создания базы данных MongoDB use DATABASE_NAME
команду use DATABASE_NAME
:
>use exampledb switched to db exampledb
Чтобы отобразить все существующие базы данных, попробуйте show dbs
:
> show dbs local 0.078GB prototype 0.078GB test 0.078GB
exampledb
нет в списке, потому что нам нужно вставить хотя бы один документ в базу данных. Чтобы вставить документ, вы можете сделать db.COLLECTION_NAME.insertOne({"key":"value"})
. Вот пример:
> db.users.insertOne({'name':'Bob'}) { "acknowledged" : true, "insertedId" : ObjectId("5a52c53b223039ee9c2daaec") }
MongoDB автоматически создает новую коллекцию users
и вставляет документ с парой ключ-значение 'name':'Bob'
. Возвращенный ObjectId является идентификатором вставленного документа. MongoDB создает уникальный ObjectId для каждого документа при создании и становится значением по умолчанию поля _id
:
>show dbs exampledb 0.078GB local 0.078GB prototype 0.078GB test 0.078GB
Аналогично, вы можете подтвердить, что коллекция была создана с помощью команды show collections
:
> show collections users
Мы создали базу данных, добавили коллекцию с именами users
и вставили в нее документ. Теперь давайте попробуем отбросить это. Чтобы удалить существующую базу данных, используйте команду dropDatabase()
как показано ниже:
>db.dropDatabase() { "ok" : 1 }
show dbs
подтверждает, что база данных действительно была удалена.
> show dbs local 0.078GB prototype 0.078GB test 0.078GB
Дополнительные операции с базой данных см. На справочной странице MongoDB в разделе « Команды базы данных» .
MongoDB CRUD Операции
Как вы, возможно, уже знаете, аббревиатура CRUD расшифровывается как «Создать, прочитать, обновить и удалить». Это четыре основные операции с базой данных, которых вы не можете избежать при создании приложения. Например, любое современное приложение будет иметь возможность создавать нового пользователя, читать пользовательские данные, обновлять пользовательскую информацию и, при необходимости, удалять учетную запись пользователя. Давайте сделаем это на уровне базы данных, используя MongoDB.
Создать операцию
Создание аналогично вставке документа в коллекцию. В предыдущем разделе мы вставили один документ, используя синтаксис db.collection.insertOne()
. Есть еще один метод с именем db.collection.insertMany()
который позволяет вставлять сразу несколько документов. Вот синтаксис:
> db.COLLECTION_NAME.insertMany( [ <document 1> , <document 2>, ... ] )
Давайте создадим коллекцию users
и наполним ее некоторыми фактическими пользователями:
> db.users.insertMany([ { "name": "Tom","age":33, "email": "[email protected]" }, { "name":"Bob", "age":35, "email":"[email protected]" }, { "name": "Kate", "age": 27, "email": "[email protected]" }, { "name": "Watson", "age":15, "email":"[email protected]"} ]) { "acknowledged" : true, "insertedIds" : [ ObjectId("5a52cb2451dd8b08d5a22cf5"), ObjectId("5a52cb2451dd8b08d5a22cf6"), ObjectId("5a52cb2451dd8b08d5a22cf7"), ObjectId("5a52cb2451dd8b08d5a22cf8") ] }
Метод insertMany
принимает массив объектов, а взамен мы получаем массив объектов ObjectId
.
Операция чтения
Операция чтения используется для извлечения документа или нескольких документов из коллекции. Синтаксис для операции чтения следующий:
> db.collection.find(query, projection)
Чтобы получить все пользовательские документы, вы можете сделать это:
> db.users.find().pretty() { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf5"), "name" : "Tom", "age" : 33, "email" : "[email protected]" } { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf6"), "name" : "Bob", "age" : 35, "email" : "[email protected]" } { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf7"), "name" : "Kate", "age" : 27, "email" : "[email protected]" } { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf8"), "name" : "Watson", "age" : 15, "email" : "[email protected]" }
Это соответствует запросу SELECT * FROM USERS
из базы данных SQL.
pretty
метод — это метод курсора, и есть много других. Вы можете объединить эти методы в цепочку, чтобы изменить ваш запрос и документы, возвращаемые запросом.
Что если вам нужно отфильтровать запросы и вернуть подмножество коллекции? Скажем, найдите всех пользователей младше 30. Вы можете изменить запрос следующим образом:
> db.users.find({ "age": { $lt: 30 } }) { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf7"), "name" : "Kate", "age" : 27, "email" : "[email protected]" } { "_id" : ObjectId("5a52cb2451dd8b08d5a22cf8"), "name" : "Watson", "age" : 15, "email" : "[email protected]" }
$lt
— это оператор фильтра запросов, который выбирает документы, у которых значение поля age
меньше 30. Доступно множество фильтров сравнения и логических запросов, и вы можете увидеть весь список в документации по средству выбора запросов .
Операция обновления
Операция обновления изменяет документ в коллекции. Подобно операции создания, MongoDB предлагает два метода обновления документа. Они есть:
-
db.collection.updateMany(filter, update, options)
-
db.collection.updateMany(filter, update, options)
.
Если вам нужно добавить дополнительное поле, скажем, registration
, ко всем существующим документам в коллекции, вы можете сделать что-то вроде этого:
> db.users.updateMany({}, {$set: { 'registration': 'incomplete'}}) { "acknowledged" : true, "matchedCount" : 4, "modifiedCount" : 4 }
Первый аргумент — пустой объект, потому что мы хотим обновить все документы в коллекции. $set
— это оператор обновления, который устанавливает значение поля с указанным значением. Вы можете проверить, что дополнительное поле было добавлено с помощью db.users.find()
.
Чтобы обновить значение документов, соответствующих определенным критериям, updateMany()
принимает объект фильтра в качестве первого аргумента. Например, вы можете перезаписать значение registration
для всех пользователей старше 18 лет. Вот что вы можете сделать:
> db.users.updateMany( {'age':{ $gt: 18} }, {$set: { 'registration': 'complete'} }) { "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Чтобы обновить регистрационные данные одного пользователя, вы можете сделать это:
> db.users.updateOne( {'email': '[email protected]' }, {$set: { 'registration': 'complete'} }) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Удалить операцию
Операция удаления удаляет документ из коллекции. Чтобы удалить документ, вы можете использовать метод db.collection.deleteOne(filter, options)
, а для удаления нескольких документов вы можете использовать метод db.collection.deleteMany(filter, options)
.
Чтобы удалить документы на основе определенных критериев, вы можете использовать операторы фильтра, которые мы использовали для операции чтения и обновления:
db.users.deleteMany( { status: { $in: [ "dormant", "inactive" ] } } ) { "acknowledged" : true, "deletedCount" : 1 }
При этом удаляются все документы со статусом «неактивный» или «неактивный».
Вот и все.
Обзор драйверов MongoDB
Чтобы приложение могло взаимодействовать с mongodb-сервером, вы должны использовать клиентскую библиотеку, называемую драйвером . Драйвер располагается поверх сервера базы данных и позволяет вам взаимодействовать с базой данных с помощью API драйвера. MongoDB имеет официальные и сторонние драйверы для всех популярных языков и сред.
В этом уроке мы рассмотрим наши варианты драйверов для Node.js. Некоторые драйверы добавляют множество полезных функций, таких как поддержка схем и проверка бизнес-логики, и вы можете выбрать ту, которая соответствует вашему стилю. Популярные драйверы для Node.js включают собственный драйвер MongoDB и Mongoose. Я кратко расскажу об их особенностях здесь.
MongoDB Node.js Драйвер
Это официальный драйвер MongoDB для Node.js. Драйвер может взаимодействовать с базой данных, используя обещания или обратные вызовы, а также поддерживает функции ES6 async / await. Пример ниже демонстрирует подключение драйвера к серверу:
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017/exampledb'; // Database Name const dbName = 'exampledb'; (async function() { let client; try { // Attempts to connect to the server client = await MongoClient.connect(url); console.log("Successfully connected to the server."); const db = client.db(dbName); } catch (err) { //Log errors to console console.log(err.stack); } if (client) { client.close(); } })();
MongoClient.connect
возвращает обещание, и любая ошибка try … catch
блоком try … catch
. Вы будете реализовывать действия CRUD внутри блока try … catch
, и API для этого аналогичен тому, что мы рассмотрели в этом руководстве. Вы можете прочитать больше об этом на официальной странице документации.
Мангуст водитель
Другой популярный драйвер Node.js для MongoDB — Mongoose . Mongoose построен поверх официального драйвера MongoDB. Когда был выпущен Mongoose, у него было множество функций, которых не было у родного драйвера MongoDB. Одной из важных особенностей была возможность определить структуру схемы, которая будет отображаться в коллекции базы данных. Однако в последних версиях MongoDB некоторые из этих функций были приняты в форме схемы JSON и проверки схемы.
Помимо схемы, другие модные функции Mongoose включают в себя модели, валидаторы и промежуточное ПО, метод populate
, плагины и так далее. Вы можете прочитать больше об этом в документации Mongoose. Вот пример, демонстрирующий mongoose.connect()
для подключения к базе данных:
var mongoose = require('mongoose'); // Connection URL const url = 'mongodb://localhost:27017/exampledb'; mongoose.connect(url); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { // we're connected! });
Вывод
MongoDB — это популярное решение для баз данных NoSQL, отвечающее современным требованиям разработки. В этом уроке мы рассмотрели основы MongoDB, оболочку Mongo и некоторые популярные драйверы. Мы также изучили общие операции с базой данных и действия CRUD в оболочке Mongo. Теперь пришло время отправиться и попробовать то, что мы рассмотрели здесь и многое другое. Если вы хотите узнать больше, я рекомендую создать REST API с MongoDB и Node, чтобы ознакомиться с общими операциями и методами базы данных.