> For the complete documentation index, see [llms.txt](https://antons-organization-1.gitbook.io/administrirovanie-linux/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://antons-organization-1.gitbook.io/administrirovanie-linux/servisy-linux/sistemy-upravleniya-bazami-dannykh/ustanovka-i-nastroika-subd-mongodb.md).

# Установка и настройка СУБД MongoDB

MongoDB — одна из самых распространенных нереляционных систем управления базами данных, работает под Linux. В основе Mongo лежит «Документ», в то время как в основе самой распространенной реляционный СУБД MySQL лежат столбцы и колонки.

## Установка MongoDB

Устанавливаем MongoDB из стандартного репозитория

`apt-get update`

`apt-get install mongodb`

Данные mongodb по умолчанию будет хранить в каталоге **/var/lib/mongodb**\
Логи — в каталоге — **/var/log/mongodb**

Также, для работы MongoDB необходимо создать директорию /data/db, которая не создается при установке:

```javascript
sudo mkdir -p /data/db
```

Далее нужно назначить пользователя **mongodb** владельцем каталога:

```javascript
sudo chown mongodb:mongodb /data/db
```

Стартуем сервис

`systemctl start mongodb`

\*По умолчанию сервис должен быть запущен, чтобы проверить его статус, введите:

`systemctl status mongodb`\
Вывод:

```
● mongodb.service - An object/document-oriented database
     Loaded: loaded (/lib/systemd/system/mongodb.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2023-07-28 07:56:11 UTC; 20min ago
       Docs: man:mongod(1)
   Main PID: 93976 (mongod)
      Tasks: 23 (limit: 2236)
     Memory: 44.9M
     CGroup: /system.slice/mongodb.service
             └─93976 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf

Jul 28 07:56:11 cluster-one systemd[1]: Started An object/document-oriented database.

```

Заходим в mongo

`mongo`

***Welcome to the MongoDB shell.***\
***For interactive help, type «help».***\
***For more comprehensive documentation, see***\
***<http://docs.mongodb.org/**_\\>
\_**&#x51;uestions? Try the support group\*\**\
***<http://groups.google.com/group/mongodb-user**_\\>
\_**>\*\**

СУБД используем **BSON** — своеобразную интерпретацию **JSON (JavaScript Object Notation)**

Рассмотрим примеры и убедимся в том, что синтаксис очень схож.\
**JavaScript:**

```
firstname = "Andrey";
 lastName = "Ivanov";
 Age = 25
```

\
**BSON:**

<pre><code><strong>USER COLLECTION
</strong><strong> {
</strong> _id:ObjectId("7678sd6fsdfbhw367er3"),
 "firstName":"Andrey",
 "lastName": "Ivanov"
 "Age": 25,
 "projects:["Project A", "Project B", "Project C"]"
 "addresses": [
 {
 street: "123 Lunacharskogo st"
 city: "Yekaterinburg",
 state: "Sverdlovskaya oblast"
 },
 {
 street: "4568 Sadovaya st"
 city: "Moscow",
 state: "Central region"
 }
 ]
 },
 {
 _id:ObjectId("7678s7826fsdfbhw367er3"),
 "firstName":"Nikolay",
 "lastName": "Petrov"
 "Age": 54
 };
</code></pre>

Таким образом, заметно основное отличие реляционных БД.

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

`>use admin`

`>db.getUsers()`

Выводим всех пользователей, существующих в документах — элементах БД

Поскольку в данный момент пользователей нет, вывода также не будет.

## **Создадим пользователя admin и пользователей с ограниченными правами** для MongoDB Linux

Заходим в консоль СУБД

`mongo`

Даем указание на необходимость использования базы

`>use admin`

***switched to db admin***

Создадим пользователя с правами "userAdminAnyDatabase".Чтобы создать пользователя, введите:

```
db.createUser(
  {
    user: "username",
    pwd: "password",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
```

Где:

username — имя пользователя,

password — пароль.

<figure><img src="https://1475196942-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUQ5Utaeg7lWvTKSyoVP7%2Fuploads%2Fcv1RFC7X7EFocRbmuBcz%2Fimage.png?alt=media&amp;token=49b0978a-4ce6-46dc-8a70-9de73b25f924" alt=""><figcaption></figcaption></figure>

Теперь мы можем проверить список пользователей в БД admin:

`>db.getUsers()`

<figure><img src="https://1475196942-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUQ5Utaeg7lWvTKSyoVP7%2Fuploads%2Fgzn5KKAB20Moo5iGFsqG%2Fimage.png?alt=media&amp;token=e8ed6522-765c-4ba4-adfd-326b6eb75d32" alt=""><figcaption></figcaption></figure>

### Создаем новую базу&#x20;

Чтобы создать новую базу данных, введите команду:

```
use database
```

Вместо **database** введите название базы данных.

Создадим базу данных **people**:

`use people`

Если БД с таким названием уже существует, вы переключитесь на работу с ней.

Как узнать, с какой базой данных идёт работа:

```
db
```

Чтобы увидеть список баз данных:

```
show dbs
```

### **Добавляем другого пользователя**

Добавляем пользователя с правами на чтение и запись

```
db.createUser(
   {
    user: "username",
    pwd: "password",
    roles: [ { role: "readWrite", db: "people" } ]
  }
)

```

Где:

username — имя пользователя,

password — пароль.

### Включаем авторизацию

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

Открываем конфигурационный файл:

`nano /etc/mongodb.conf`

Находим директиву **security** и задаем параметр **authorization** (либо добавляем директиву при её отсутствии):

`security:`\
&#x20; `authorization: enabled`

<figure><img src="https://1475196942-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FUQ5Utaeg7lWvTKSyoVP7%2Fuploads%2FJ2O5PPimMcbCC0ztOzNG%2Fimage.png?alt=media&amp;token=4af337a4-e9a4-4ee2-b281-b2e282949de6" alt=""><figcaption></figcaption></figure>

Перезапускаем сервис mongodb:

`systemctl restart mongodb`

Теперь пробуем подключиться к mongo. Мы можем авторизоваться несколькими способами.

а) Авторизация при подключении:

`mongo --authenticationDatabase "admin" -u "gutovad" -p`

*\* в данном примере мы подключимся к базе под пользователем gutovad. Пароль будет запрошен системой после ввода команды. Также, после опции -p можно указать пароль в кавычках, например, -p "P\@ssw0rd", таким образом пароль не будет запрашиваться системой.*

б) Авторизация после подключения:

`> use admin`

`> db.auth("root", passwordPrompt())`

## Недостатки СУБД MongoDB <a href="#id-7" id="id-7"></a>

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

* Сложность работы с транзакциями.
* Меньшее соответствие требованиям к транзакционным системам (ACID — атомарность, согласованность, изолированность, прочность), чем реляционные БД.

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

## **Сравнение MongoDB и MySQL в зависимости от задач:**

{% embed url="<https://habr.com/ru/articles/322532/>" %}

{% embed url="<https://habr.com/ru/companies/otus/articles/587858/>" %}

{% embed url="<https://www.dmosk.ru/miniinstruktions.php?mini=mongodb-ubuntu>" %}

{% embed url="<https://winitpro.ru/index.php/2019/12/27/ustanovka-i-nastrojka-mongodb-linux/>" %}
