# Установка и настройка СУБД 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.***\
\&#xNAN;***For interactive help, type «help».***\
\&#xNAN;***For more comprehensive documentation, see***\
\&#xNAN;*\*\*<http://docs.mongodb.org/**_\\>
\&#xNAN;***Questions? Try the support group***\
\&#xNAN;***<http://groups.google.com/group/mongodb-user**_\\>
\&#xNAN;\_**>\*\*\_

СУБД используем **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="/files/ztJxt4kYxfMYNOOvmwq7" alt=""><figcaption></figcaption></figure>

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

`>db.getUsers()`

<figure><img src="/files/zeLTeSwBluhSUtEvD2k4" 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="/files/mXuAwnFnvfsfMyuYUJUP" 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/>" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://antons-organization-1.gitbook.io/administrirovanie-linux/servisy-linux/sistemy-upravleniya-bazami-dannykh/ustanovka-i-nastroika-subd-mongodb.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
